2017-01-18 3 views
0

Посмотрите на следующий код:Почему (переменная типа IEnumerable <SomeThing>) .GetType(). GetGenericArgsuments(). Count() - это два вместо одного?

Почему result1 имеет 2 общих аргумента?

public class Program 
    { 
     public static void Main(string[] args) 
     { 
      IEnumerable<Test> result1 = Test1(); 
      Console.WriteLine(result1.GetType().GetGenericArguments().Count()); // 2 

      IEnumerable<Test> result2 = Test2(); 
      Console.WriteLine(result2.GetType().GetGenericArguments().Count()); // 1 
     } 

     public static IEnumerable<Test> Test1() 
     { 
      return new Test[] { }.Where(t => t.Id > 1).Select(t => 
      { 
       t.Id++; 
       return t; 
      }); 
     } 

     public static IEnumerable<Test> Test2() 
     { 
      return new Test[] { }.Where(t => t.Id > 1); 
     } 
    } 

    public class Test 
    { 
     public virtual int Id { get; set; } 
    } 

ответ

7

Это потому, что вы получите обратно от Test1 является экземпляром WhereSelectArrayIterator, который принимает два обобщенных параметров, тип источника и тип результата. то есть class WhereSelectArrayIterator<TSource, TResult> или см. the reference source.

Однако сам класс реализует IEnumerable <TResult>, который позволяет назначать его переменной. Ошибка, которую вы делаете, путает назначаемый тип (который является IEnumerable <Test>) с типом реализации (WhereSelectArrayInterator). Когда у вас просто есть оператор where, существует только один общий тип, так как он не преобразует типы из источника в результат.

В этом случае печать названий типов даст вам ответ.

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

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