2010-05-07 60 views
3

即使您沒有在頂部包含必要的using聲明,Visual Studio/intellisense如何知道如何處理聲明爲var的變量?var'沒有使用someNamespace'的關鍵字

例如,我有不同的命名空間 定義的類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 s的一切?!)

+0

你能在這兩種情況下發布程序中的實際代碼嗎?我懷疑你真的有一個名爲Foo的方法和一個名爲MyDomainObject的類,也許真正的代碼可以揭示它。 – 2010-05-07 14:36:22

+0

對不起,對我無效......它不會編譯在任何情況下 – tanascius 2010-05-07 14:36:41

+0

請參閱Jon Skeet對我在真實代碼中遇到的情況的回答 – RichK 2010-05-07 14:48:47

回答

6

你的構造函數的示例將不起作用,但稍有更多的參與情況。例如,假設您有三種:在命名空間

  • 類Foo N1在命名空間N2
  • 類巴茲在命名空間N3
  • 類酒吧

現在假設Bar有返回的方法Foo的一個實例:

public static Foo GetFoo() { ... } 

在這裏,Bar.cs會需要N1使用指令,除非它指定完整的名稱。

現在假設我們有這樣的代碼在巴茲:

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

這將編譯,但

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

不會。原因是隻有使用指令才能讓編譯器知道名稱「Foo」的含義 - 它的完全限定名稱是什麼。在第一個片段中,Bar.GetFoo()被有效地聲明爲返回N1.Foo,所以編譯器沒問題。在第二個片段中,編譯器首先看到「Foo」,並不知道N1的任何內容,所以不知道如何查看它。

+0

感謝Jon,他的答案都是爲了解決我給窮人提出的問題示例 – RichK 2010-05-07 14:48:02

+0

+1優秀和簡潔的解釋 – 2010-05-07 17:15:21

6

簡短的回答是,事實並非如此。

您看到的行爲和差異必定有其他原因。

您可以使用簡短但完整的程序重現問題,以便您可以將其發佈到此處?

var關鍵字沒有什麼神奇的地方,它只是根據賦值語句右側的表達式(在這種情況下)推斷出所需的類型,所以沒有理由說明其中一個代碼段應該工作比其他更好。

0

它知道對象的完全限定類型,因爲此類型位於其中一個引用的程序集中。

using SomeNamespace只是簡寫說明可以說MyType而不是SomeNamespace.MyType