给定一个类和名称空间,定义如下;对未定义名称空间中定义类型的类型推断
namespace Models
{
public class Foo
{
}
}
而下面......
namespace Factories
{
using Models;
class FooFactory
{
public Foo GetFoo()
{
return new Foo();
}
}
}
最后...
namespace InferenceTest
{
using Factories;
class Program
{
static void Main()
{
Foo foo = new FooFactory().GetFoo();
}
}
}
正如你所期望的,该代码失败,出现错误“的类型或编译名称空间名称'Foo'无法找到(您是否缺少使用指令或程序集引用?)“
但是,如果我行更改为这个...
var foo = new FooFactory().GetFoo();
然后编译和运行得很好。
为什么会有这种差异?类型推断是什么使它能够查看尚未导入的名称空间中的类型。命名空间只是语法糖吗?
我不知道这足够好发表权威的答案,但是我会说当你使用'var'你将它留给编译器来确定类型,所以有一个合格的命名空间将是没有帮助的,因为它知道类型是什么。当使用显式类型时,可能指的是具有相同名称(不同名称空间)的不同类型,因此必须明确如何限定类型。 – Lukazoid 2014-12-05 13:43:40
您不必有一个using指令来声明该类型的变量,它只是允许您使用缩短的类型声明。 'Models.Foo foo = new FooFactory()。GetFoo();'会编译得很好。使用var它并不重要什么使用指令,因为你不是说“声明这个特定类型的变量foo”你在说“声明可变foo并从初始化中推断出这个类型”。 – 2014-12-05 13:44:18
噢好吧,所以“var”实际上只是被全限定类型名称替换。“Models.Foo”? – 2014-12-05 13:46:50