【问题标题】:var keyword without 'using someNamespace'var 关键字没有“使用 someNamespace”
【发布时间】:2010-05-07 14:33:50
【问题描述】:

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

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

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

但是如果我使用var

var myObj = new MyDomainObject();

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

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

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

【问题讨论】:

  • 你能在这两种情况下发布你程序中的实际代码吗?我怀疑您是否真的有一个名为 Foo 的方法和一个名为 MyDomainObject 的类,也许真实的代码可以对此有所了解。
  • 对不起,对我不起作用...无论如何它都无法编译
  • 查看 Jon Skeet 对我在真实代码中遇到的情况的回答

标签: c# using var


【解决方案1】:

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

  • 命名空间 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”的含义 - 它的完全限定名称是什么。在第一个 sn-p 中,Bar.GetFoo() 被有效地声明为返回 N1.Foo,所以编译器没问题。在第二个 sn-p 中,编译器首先看到“Foo”并且不知道有关 N1 的任何信息,因此不知道如何查找它。

【讨论】:

  • 感谢乔恩,感谢乔恩的回答和设法理解我糟糕的例子中的问题
【解决方案2】:

简短的回答是它没有。

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

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

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

【讨论】:

    【解决方案3】:

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

    using SomeNamespace 只是一种简写形式,可以使用MyType 而不是SomeNamespace.MyType

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 2018-04-04
      • 2010-11-15
      • 2013-04-19
      • 1970-01-01
      相关资源
      最近更新 更多