2012-08-15 4 views
6

暗黙の型変数varは、スコープ内で定義されていないタイプ(usingを使用している)をどのように知ることができますか?varは未定義の型をどのように知ることができますか?

例:

これは

public class MyClass 
{ 
    public void MyMethod   
    { 
     var list = AStaticClass.GetList(); 
    } 
} 

okです。しかしこれは、私はそれを動作させるためにusing System.Collections.Generic;を追加する必要があり、最後のコードスニペットで

public class MyClass 
{ 
    public void MyMethod   
    { 
     List<string> list = AStaticClass.GetList(); 
    } 
} 

OKではありません。

これはどのように機能しますか?

+1

「いいえ」とは何ですか?あなたは*正確に何を意味しますか? – Tigran

+1

コンパイルしないと、コンパイラは 'List '(またはそのようなもの)という不明な型を返します。 –

答えて

11

これはどのように機能しますか?

コンパイラはSystem.Collections.Generic.List<string>varを置き換え、あなたのコードになる型推論を行います。

public class MyClass 
{ 
    public void MyMethod   
    { 
     System.Collections.Generic.List<string> list = AStaticClass.GetList(); 
    } 
} 

しかし、コンパイラは、IL、(任意のusing文なし)次のC#のプログラムを吐く以来:

public class Program 
{ 
    static void Main() 
    { 
     var result = GetList(); 
    } 

    static System.Collections.Generic.List<string> GetList() 
    { 
     return new System.Collections.Generic.List<string>(); 
    } 
} 

Main方法は次のようになります。

.method private hidebysig static void Main() cil managed 
{ 
    .entrypoint 
    .maxstack 8 
    L_0000: call class [mscorlib]System.Collections.Generic.List`1<string> Program::GetList() 
    L_0005: pop 
    L_0006: ret 
} 

コンパイラは、代入演算子の右辺から型を推論し、varを完全修飾型名に置き換えました。

3

実際にコンパイラがその型を認識しています。コンパイラを使って短縮しなかったとしても、 'var'をフルタイプ定義System.Collections.Generic.List<string>に置き換えることができます。同じ方法で、 'using'ディレクティブなしでその行で変数を定義することができます。

関連する問題