2011-07-10 5 views
2
var numbers=new int[]{1,2,3}; 
var numbers1=numbers.Select(n=>n); 
var numbers2=numbers.Select(n=>n.ToString()); 
var numbers3=numbers.Select(n=>new {Number=n, Even=n%2==0}); 

拡張機能SELECTの出力は、どのようなタイプにすることができますか?ラムダ式(拡張機能の選択はどのように定義されていますか)

+0

このテーマが興味のある人は、ここでどのように動作するのかを説明するビデオがあります:http://blogs.msdn.com/b/ericlippert/archive/2006/11/17/a-face-made-for- email-part-three.aspx –

答えて

5

それは次のシグネチャで定義されたgeneric拡張メソッドです:ソースとセレクタ引数に存在する型情報付き

public static IEnumerable<Tresult> Select<TSource, TResult>(
       this IEnumerable<TSource> source, 
       Func<TSource, TResult> selector); 

、コンパイラは、明示的にする必要はありませんので、使用の種類を推測することができますそれに名前を付けます。

+0

メソッドの戻り値の型( 'IEnumerable ')を含めるのを忘れた。 – Groo

1

ここSelectの特定のバージョンがT入力(この場合は、int)の一種であり、TResultが出力さFunc<T, TResult>セレクタをとります。ラムダ式に基づいて、コンパイラはTResultの型を推論できます。あなたのケースでは、タイプは、あなたがそのような無名関数について興味があれば、私はおそらくから始まる、C# 4.0 language specificationをチェックアウトするあなたに奨励

  • int型
  • 文字列
  • 匿名

ですセクション7.15。

1

IEnumerable.Selectはこれらのシグネチャとgeneric methodある:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, TResult> selector 
) 

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, int, TResult> selector 
) 

渡された関数がTResultを返す必要とSelect自体がIEnumerable<TResult>を返します。 TResultのタイプはコンパイラによって(ポストで行われているように)推論することも、明示的に注釈を付けることもできます。

ジェネリックの詳細 - どのようにTResultを「任意の特定のタイプ」にすることができるかは、C# Generics Programming Guideにあります。 C#型推論(ジェネリックの推論を含む)の限界についても議論する多くのSOの質問があります。

ハッピーコーディング。

関連する問題