奇数方法行为 – 函数的ToString

请考虑以下代码段:

class Program { static void Main(string[] args) { Console.WriteLine(Test().ToString()); } static IEnumerable Test() { foreach (var ch in "test") yield return ch; } static IEnumerable TestOk() { return "test"; } } 

Test().ToString()返回“ConsoleApplication1.Program + d__0”而不是预期的“test”。

Test()方法甚至没有执行 – 只返回它的名字! 第二种方法TestOk()工作得很好。

到底是怎么回事?

它在编译器生成的IEnumerable实现上打印ToString方法 – 迭代器只是语法糖 – 生成IEnumerable的实际实现。

Test()方法返回一个IEnumerable(char),在本例中是一个编译器生成的对象。 它的ToString()方法是对象的默认方法,并返回类型名称,也是编译器生成的。

对于编译器,yeild返回方法的处理方式不同 – 如果使用reflection器检查编译的程序集,这里的内容会更加清晰:

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

Wheras TestOk返回一个字符串, Test代替返回编译器为您生成的类。 您看到的是该类的默认字符串表示forms。

其他答案已经解释了当前的行为,但是如果你想获得预期的行为,那么你可以将IEnumerable转换为数组并使用带有char[]的String构造函数,而不是使用ToString():

 Console.WriteLine(new string(Test().ToArray()));