隐式类型变量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;
才能正常工作。
这是如何工作的?
答案 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>
”...就像使用该行定义变量而不使用“使用”一样指令。