6

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

例:

これで結構です

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

しかし、これは大丈夫ではありません

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

最後のコード スニペットでは、機能using System.Collections.Generic;させるために追加する必要があります。

これはどのように作動しますか?

4

2 に答える 2

11

これはどのように作動しますか?

コンパイラが型推論を行うと、それが置き換えvarられSystem.Collections.Generic.List<string>、コードは次のようになります。

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

ただし、コンパイラは IL を出力するため、次の C# プログラム (usingステートメントなし):

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し、完全修飾型名に置き換えました。

于 2012-08-15T11:31:58.203 に答える
3

コンパイラは実際に型を認識しています。コンパイラを使用して短縮しなかったとしても、「var」を名前空間を持つ完全な型定義に置き換えることができますSystem.Collections.Generic.List<string>...「using」ディレクティブなしでその行で変数を定義できるのと同じ方法です。

于 2012-08-15T11:33:08.593 に答える