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

这是如何运作的?

当编译器进行类型推断时,它会替换varSystem.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

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

于 2012-08-15T11:33:08.593 回答