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

Ric*_*chK 3 c# var using

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

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

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

但是,如果我使用 var

var myObj = new MyDomainObject();
Run Code Online (Sandbox Code Playgroud)

这将编译,intellisense确切地知道我能用它做什么.

那么如何知道它的类型是什么using

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

ang*_*son 6

简短的回答是它没有.

你所看到的行为和差异必然有其他原因.

你能用一个简短但完整的程序重现问题,以便你可以在这里发布吗?

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


Jon*_*eet 6

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

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

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

public static Foo GetFoo() { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

using N2;
...
var foo = Bar.GetFoo();
Run Code Online (Sandbox Code Playgroud)

那会编译,但是

using N2;
...
Foo foo = Bar.GetFoo();
Run Code Online (Sandbox Code Playgroud)

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