var如何知道未定义的类型?

时间:2012-08-15 11:29:55

标签: c# syntax

隐式类型变量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;才能正常工作。

这是如何工作的?

2 个答案:

答案 0 :(得分: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替换为完全限定的类型名称。

答案 1 :(得分:3)

编译器实际上知道类型。即使您没有使用编译器缩短它,仍然可以使用命名空间var替换带有完整类型定义的“System.Collections.Generic.List<string>”...就像使用该行定义变量而不使用“使用”一样指令。