没有'使用someNamespace'的var关键字

时间:2010-05-07 14:33:50

标签: c# using var

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

例如,我在不同的命名空间中定义了类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?)

3 个答案:

答案 0 :(得分:6)

简短的回答是它没有。

您所看到的行为和差异必然存在其他原因。

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

var关键字没有任何神奇之处,它只是根据赋值右侧的表达式(在本例中)推断出所需的类型,因此没有理由为什么其中一个代码碎片应该比另一块更好。

答案 1 :(得分:6)

使用构造函数的示例将不起作用,但稍微更复杂的情况将会发生。例如,假设您有三种类型:

  • 命名空间N1中的类Foo
  • 命名空间N2中的类栏
  • 命名空间N3中的Baz类

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

public static Foo GetFoo() { ... }

这里,Bar.cs需要一个N1的using指令,除非它指定了完整的名称。

现在假设我们在Baz中有这个代码:

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

那将编译,但

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

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

答案 2 :(得分:0)

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

using SomeNamespace只是一种速记,可以说MyType而不是SomeNamespace.MyType