代码之家  ›  专栏  ›  技术社区  ›  RichK

不带“using somenamespace”的var关键字

  •  3
  • RichK  · 技术社区  · 15 年前

    visual studio/intellisense如何知道如何处理声明为 var 即使你没有包括必要的 using 最高层的宣言?

    例如,我有课 MyDomainObject 在不同的命名空间中定义 如果我不申报 using TheOtherNameSpace; 在该文件中,以下代码无法编译:

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

    但如果我用 var

    var myObj = new MyDomainObject();
    

    这将编译,intellisense知道我能用它做什么。

    所以它怎么知道没有 使用 ?

    (作为旁白,如果它知道没有 使用 ,为什么我们需要 使用 是吗?!)

    3 回复  |  直到 15 年前
        1
  •  6
  •   Jon Skeet    15 年前

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

    • 命名空间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();
    

    不会的。原因是using指令只存在于那里,这样编译器就知道“foo”这个名称的含义了——它的完全限定名是什么。在第一个片段中, Bar.GetFoo() 有效地宣布返回 N1.Foo ,所以编译器很好。在第二个片段中,编译器首先看到“foo”,对n1一无所知,所以不知道如何查找它。

        2
  •  6
  •   Lasse V. Karlsen    15 年前

    简而言之,答案是没有。

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

    你能用一个简短但完整的程序重现这个问题吗?这样你就可以把它贴在这里了。

    没有什么神奇的 var 关键字,它只是根据赋值右侧的表达式(在本例中)推断所需的类型,因此没有理由说明其中一个代码段应该比另一个代码段工作得更好。

        3
  •  0
  •   Gart    15 年前

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

    using SomeNamespace 只有速记才能说 MyType 而不是 SomeNamespace.MyType