2017-01-24 18 views
0

我用VS 2017年的RC和C#新特性玩:匿名類型在其範圍局部功能

class Program 
{ 
     class A 
     { 
      public int Z1 { get; set; } 
      public int Z2 { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      var q = new[] { new A() }.Select(x => new { x.Z2 }); 
      Do(q.First()); 
      int Do<T>(T p) 
      { 
       Console.WriteLine(p.GetType().Name); 
       return 0; 
      } 
     } 
} 

上面的代碼並編譯和輸出

"<>f__AnonymousType0`1" 

然而,以下不:

Console.WriteLine(p.Z2); 

產生

錯誤CS1061「T」不包含關於「Z2」的定義和沒有 擴展方法「Z2」接受類型「T」可以是的第一個參數 (是否缺少using指令或裝配參考?)

這是什麼東西還沒有完成呢?我們能否在發佈後訪問本地函數內的匿名類型的屬性?

+0

您可以添加任何參考源,讓你覺得它應該工作?還沒有看過那個。 – Slai

+0

這將表現與非本地功能相同。 – Servy

回答

4

這與本地功能根本無關。這是C#泛型的一個限制(通過設計)。

您不能在函數內部訪問.Z2,因爲不是每種可能的類型都有它。

如果你不推廣你的方法,而是需要一個A來代替,那麼這將起作用。

 int Do(A p) { 
      Console.WriteLine(p.Z2); 
      return 0; 
     }