3

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

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

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

但是如果我使用var

var myObj = new MyDomainObject();

这将编译,并且智能感知确切地知道我能用它做什么。

那么它怎么知道没有 的类型是什么using

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

4

3 回答 3

6

简短的回答是它没有。

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

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

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

于 2010-05-07T14:35:39.683 回答
6

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

  • 命名空间 N1 中的类 Foo
  • 命名空间 N2 中的类 Bar
  • 命名空间 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();

惯于。原因是 using 指令只是为了让编译器知道名称“Foo”的含义——它的完全限定名称是什么。在第一个片段中,Bar.GetFoo()被有效地声明为 return N1.Foo,所以编译器很好。在第二个片段中,编译器首先看到“Foo”并且对 N1 一无所知,因此不知道如何查找它。

于 2010-05-07T14:40:59.793 回答
0

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

using SomeNamespace只是一种简写方式,可以说MyType而不是SomeNamespace.MyType.

于 2010-05-07T14:39:59.597 回答