[英]Odd method behavior - ToString of a function
請考慮以下代碼段:
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()
工作得很好。
到底是怎么回事?
它在編譯器生成的IEnumerable實現上打印ToString方法 - 迭代器只是語法糖 - 生成IEnumerable的實際實現。
Test()方法返回一個IEnumerable(char),在本例中是一個編譯器生成的對象。 它的ToString()方法是對象的默認方法,並返回類型名稱,也是編譯器生成的。
yeild返回方法與編譯器的處理方式不同 - 如果使用反射器檢查編譯的程序集,這里的內容會變得更加清晰:
private static IEnumerable<char> Test()
{
return new <Test>d__0(-2);
}
Wheras TestOk
返回一個字符串, Test
代替返回編譯器為您生成的類。 您看到的是該類的默認字符串表示形式。
其他答案已經解釋了當前的行為,但是如果你想獲得預期的行為,那么你可以將IEnumerable<char>
轉換為數組並使用帶有char[]
的String構造函數,而不是使用ToString():
Console.WriteLine(new string(Test().ToArray()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.