请考虑以下代码段:
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”。
Test()
方法甚至没有执行 - 只返回它的名字!第二种方法TestOk()
工作得很好。
发生了什么事?
答案 0 :(得分:7)
它在编译器生成的IEnumerable实现上打印ToString方法 - 迭代器只是语法糖 - 生成IEnumerable的真实实现。
答案 1 :(得分:2)
Test()方法返回一个IEnumerable(char),在本例中是一个编译器生成的对象。它的ToString()方法是对象的默认方法,并返回类型名称,也是生成的编译器。
答案 2 :(得分:2)
对于编译器,yeild return方法的处理方式不同 - 如果使用反射器检查已编译的程序集,这里的内容会变得更清晰:
private static IEnumerable<char> Test()
{
return new <Test>d__0(-2);
}
Wheras TestOk
返回一个字符串,Test
代替返回编译器为您生成的类。您看到的是该类的默认字符串表示形式。
答案 3 :(得分:0)
其他答案已经解释了当前的行为,但是如果你想获得预期的行为,那么你可以将IEnumerable<char>
转换为数组并使用带有{{{1}的String构造函数,而不是使用ToString()。 1}}:
char[]