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» принимающую первый аргумент типа «Т» может быть найдено (вы пропали без вести с помощью директивы или ссылка на сборку?)

Это еще что-то не завершено? Сможем ли мы получить доступ к свойствам анонимных типов внутри локальных функций после выпуска?

+0

Можете ли вы добавить источник ссылки, который заставляет задуматься над этим? Еще не видел этого. – Slai

+0

Это будет вести себя одинаково с нелокальной функцией. – Servy

ответ

4

Это не относится к локальным функциям. Это ограничение (по дизайну) генераторов C#.

Вы не можете получить доступ к .Z2 внутри функции, потому что не каждый тип будет иметь его.

Если вы де-обобщаете свой метод и вместо этого требуете A, это будет работать.

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

 Смежные вопросы

  • Нет связанных вопросов^_^