2017-01-24 22 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; 
     }