【发布时间】:2014-12-05 13:37:35
【问题描述】:
给定一个类和命名空间定义如下;
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'(您是否缺少 using 指令或程序集引用?)”
但是,如果我将这一行改为这个......
var foo = new FooFactory().GetFoo();
然后它编译并运行得很好。
为什么会有这种差异?什么是类型推断允许它查看名称空间中尚未导入的类型。命名空间只是语法糖吗?
【问题讨论】:
-
我不太了解这一点,无法发布权威答案,但是我会说,当您使用
var时,您将其留给编译器来确定类型,因此拥有合格的命名空间会没有帮助,因为它知道类型是什么。当您使用显式类型时,您可能会引用具有相同名称(不同命名空间)的不同类型,因此您必须明确说明如何限定类型。 -
您不必使用 using 指令来声明该类型的变量,它只允许您使用缩短的类型声明。
Models.Foo foo = new FooFactory().GetFoo();可以编译得很好。使用 var 时,使用什么指令并不重要,因为您不是在说“声明这种特定类型的变量 foo”,而是在说“声明变量 foo 并从初始化中推断类型”。 -
哦,好的,所以“var”实际上只是被完全限定的类型名称替换了..“Models.Foo”?
-
我不是编译器专家,但我的直觉说它不会被任何东西取代,类型声明告诉编译器变量是什么类型,var 只是告诉编译器推断类型。跨度>
-
公平 - 有道理,谢谢。
标签: c# namespaces type-inference