奇数方法行为 - 函数的ToString

时间:2010-08-14 14:28:08

标签: c# c#-4.0

请考虑以下代码段:

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()工作得很好。

发生了什么事?

4 个答案:

答案 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[]