簡體   English   中英

奇數方法行為 - 函數的ToString

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM