2013-03-01 14 views
7

これは簡単な質問ですが、WhereWhere<T>などのメソッドを持つList<T>のようなコレクションクラスには一般的で非汎用的なメソッドがあります。一般的な拡張メソッドと非汎用のリスト

例:

 List<int> numbers = new List<int>() 
     { 
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
     }; 

     IEnumerable<int> evens = numbers.Where((x) => 
     { 
      return x % 2 == 0; 
     }); 

     IEnumerable<int> evens2 = numbers.Where<int>((x) => 
     { 
      return x % 2 == 0; 
     }); 

なぜ他の上で1つを使用します(ジェネリックか非ジェネリック)?

答えて

11

これらは同じ方法です(ドキュメントhere)。コンパイラが型を自動的かつ明確にコンテキストから推論できる場合、メソッド名の後の型パラメータ部分(この場合は<int>)はオプションです。この場合、このメソッドは、インタフェースIEnumerable<int>を実装しているオブジェクト(すなわちList<int>のオブジェクトnumbers)に適用されており、そこから型パラメータがintであるとコンパイラが安全に推論することができます。

注意、また、そのWhere<T>は実際IEnumerable<T>ようList<T>としてを実装する任意のクラスのオブジェクトに適用することができるSystem.Linq.Enumerableクラスに拡張メソッドあります。

+0

明白な説明をありがとう! – infbubble

関連する問題