Нечетное поведение метода - ToString функции - PullRequest
4 голосов
/ 14 августа 2010

Рассмотрим этот фрагмент кода:

class Program {
  static void Main(string[] args) {
   Console.WriteLine(Test().ToString());
  }

  static IEnumerable<char> Test() {
   foreach (var ch in "test")
    yield return ch;
  }
  static IEnumerable<char> TestOk() {
   return "test";
  }
 }

Test().ToString() возвращает "ConsoleApplication1.Program + d__0" вместо ожидаемого "теста".

Test() метод даже не выполняется - просто возвращает его имя!Второй метод TestOk() работает просто отлично.

Что происходит?

Ответы [ 4 ]

7 голосов
/ 14 августа 2010

Он печатает метод ToString в реализации IEnumerable, сгенерированной компилятором - итераторы - просто синтаксический сахар - генерируется реальная реализация IEnumerable.

2 голосов
/ 14 августа 2010

Метод возврата yeild обрабатывается по-разному, будь то компилятор - если вы проверяете скомпилированную сборку с использованием отражателя, то, что здесь происходит, становится немного понятнее:

private static IEnumerable<char> Test()
{
    return new <Test>d__0(-2);
}

Wheras TestOk возвращает строку, Test вместо этого возвращает класс, который сгенерирует для вас компилятор.То, что вы видите, является строковым представлением этого класса по умолчанию.

2 голосов
/ 14 августа 2010

Метод Test () возвращает IEnumerable (char), который в данном случае является сгенерированным компилятором объектом. Это метод ToString () по умолчанию для объекта и возвращает имя типа, также сгенерированное компилятором.

0 голосов
/ 14 августа 2010

Другие ответы объяснили текущее поведение, но если вы хотите получить ожидаемое поведение, тогда вместо ToString () вы можете преобразовать IEnumerable<char> в массив и использовать конструктор String, который принимает char[]:

Console.WriteLine(new string(Test().ToArray()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...