2010-05-07 58 views
3

即使您没有在顶部包含必要的using声明,Visual Studio/intellisense如何知道如何处理声明为var的变量?var'没有使用someNamespace'的关键字

例如,我有不同的命名空间 定义的类MyDomainObject如果我没有在文件中声明using TheOtherNameSpace;下面的代码不会编译:

private void Foo() 
{ 
    MyDomainObject myObj = new MyDomainObject(); 
    // Doesn't know what this class is 
} 

但是,如果使用var

var myObj = new MyDomainObject(); 

这会编译,intellisense确切知道我能用它做什么。

那么如何知道没有using的类型?

(正如顺便说一句,如果它知道没有using,为什么我们需要using s的一切?!)

+0

你能在这两种情况下发布程序中的实际代码吗?我怀疑你真的有一个名为Foo的方法和一个名为MyDomainObject的类,也许真正的代码可以揭示它。 – 2010-05-07 14:36:22

+0

对不起,对我无效......它不会编译在任何情况下 – tanascius 2010-05-07 14:36:41

+0

请参阅Jon Skeet对我在真实代码中遇到的情况的回答 – RichK 2010-05-07 14:48:47

回答

6

你的构造函数的示例将不起作用,但稍有更多的参与情况。例如,假设您有三种:在命名空间

  • 类Foo N1在命名空间N2
  • 类巴兹在命名空间N3
  • 类酒吧

现在假设Bar有返回的方法Foo的一个实例:

public static Foo GetFoo() { ... } 

在这里,Bar.cs会需要N1使用指令,除非它指定完整的名称。

现在假设我们有这样的代码在巴兹:

using N2; 
... 
var foo = Bar.GetFoo(); 

这将编译,但

using N2; 
... 
Foo foo = Bar.GetFoo(); 

不会。原因是只有使用指令才能让编译器知道名称“Foo”的含义 - 它的完全限定名称是什么。在第一个片段中,Bar.GetFoo()被有效地声明为返回N1.Foo,所以编译器没问题。在第二个片段中,编译器首先看到“Foo”,并不知道N1的任何内容,所以不知道如何查看它。

+0

感谢Jon,他的答案都是为了解决我给穷人提出的问题示例 – RichK 2010-05-07 14:48:02

+0

+1优秀和简洁的解释 – 2010-05-07 17:15:21

6

简短的回答是,事实并非如此。

您看到的行为和差异必定有其他原因。

您可以使用简短但完整的程序重现问题,以便您可以将其发布到此处?

var关键字没有什么神奇的地方,它只是根据赋值语句右侧的表达式(在这种情况下)推断出所需的类型,所以没有理由说明其中一个代码段应该工作比其他更好。

0

它知道对象的完全限定类型,因为此类型位于其中一个引用的程序集中。

using SomeNamespace只是简写说明可以说MyType而不是SomeNamespace.MyType