2011-02-12 16 views
16

だから私はC#を使い始めたJavaの人です。コーディングしていて、ジェネリックメソッドを作成し始めました。私が書いたものは実行され、コンパイルされますが、私は、誰かが私にこれを説明することができます願っています:タイプを指定しないC#の汎用メソッド

だから、次のように私は定義されている一般的な方法があります:

public static List<T> CopyAsList<T>(IEnumerable<T> list, Object lockObject) 
{ 
    if (list != null) 
    { 
     lock (lockObject) 
     { 
      return new List<T>(list); 
     } 
    } 
    return null; 
} 

をしかし、私には奇妙なことは、私が今までに指定せずにこのジェネリックメソッドを呼び出すことができるということですTと動作します:

List<String> strings = new List<string>() { "a", "b", "c"}; 
List<int> ints = new List<int>() { 1,2,3}; 
object lockObject = new object(); 

foreach (string s in CopyAsList(strings, lockObject)) 
{ 
    Console.WriteLine(s); 
} 

foreach (int i in CopyAsList(ints, lockObject)) 
{ 
    Console.WriteLine(i); 
} 

ジェネリック型を指定することなくコードをコンパイルするにはどうすればいいですか? C#は実行時に型を推測しますか?

+6

何のC#は、実行時にはもうありません。 – Gabe

+0

コンパイル時にC#コンパイラが型を推論します。副報では、CLR(DLR)は実行時に型を推論できます。C#の 'dynamic'キーワードを参照してください。 – kizzx2

+1

kizzx2:OPはコンテキストから 'dynamic'を削除する' .net-3.5'で質問にタグ付けしました。実行時には型推論がありません。DLRはタイプを決定するためにリフレクションを使用します。 – Gabe

答えて

35

いいえ、それはコンパイル時に推論されます - あなたが提供するIEnumerable<T>のジェネリック型パラメータが使用されます。これはコンパイル時に知られています。一般的には、は、コンパイル時にジェネリックと型のパラメータに関して指定されています。何らかの種類の不一致がある場合、はコンパイルされ、コードはコンパイルされません。

型を明示的に指定する必要がある場合があります。これらは、まれにしかオーバーロードされたメソッドで発生することがあります。

+0

これらの状況の1つは、メソッドへの引数が動的である場合です。一度それを投げてしまうと、コンパイラのジェネリック型の推論はすべて同じ手がかりがあってもウィンドウ外です。 –

11

C#コンパイラは、コンパイル時にというジェネリックタイプを推論することができます。これを行うことができるときは、汎用メソッドの型を指定する必要はありません。

これは、LINQを「使用可能」にする主要な要素です。

IEnumerable<int> myIds = myCollection 
          .Where<MyType>(i => i.Name == "Foo") 
          .Select<MyType, int>(i => i.Id); 

代わりに書くことができるという:コンパイル時に型推論がないと、クエリは次のようになり

var myIds = myCollection.Where(i => i.Name == "Foo").Select(i => i.Id); 
+3

と匿名型のクエリは不可能です。また、型がコンパイラによって推論できない場合、コードはコンパイルされません。 – Femaref

+0

型推論がなければ、コンパイラはそれらのラムダがどんな型を持つかも知らないでしょう。 – Gabe

12

C#が非常に多くのより多くのコンパイル時およびJava以外のランタイム型推論機能を備えています。この主題は、興味のある場合は、件名に私の記事を参照してください。

http://blogs.msdn.com/b/ericlippert/archive/tags/type+inference/

あなたが特にジェネリックメソッドの型推論に興味があり、あなたは余裕の半分の時間を持っている場合は、ここで私たちがどのように変化したかを説明するのですC#3における型推論アルゴリズム:

http://blogs.msdn.com/b/ericlippert/archive/2006/11/17/a-face-made-for-email-part-three.aspx

+0

「ランタイム・タイプの推論機能」どのような機能について話していますか? 「動的」に関係するものは何ですか? – CodesInChaos

+0

@CodeInChaos:はい、C#の "dynamic"は "実行時にこの式の型分析を行い、コンパイル時ではありません"を意味します。 –

+0

私は「ダイナミック」が何をしているのか知っています。私はちょうどあなたが 'ダイナミック'機能の外でランタイム型推論について話していたかどうかを知りたかったのです。 – CodesInChaos

関連する問題