2012-08-15 99 views
6

隱式類型變量var如何知道未在作用域中定義的類型(使用using)?var如何知道未定義類型?

例子:

這是確定

public class MyClass 
{ 
    public void MyMethod   
    { 
     var list = AStaticClass.GetList(); 
    } 
} 

但是,這是不正常

public class MyClass 
{ 
    public void MyMethod   
    { 
     List<string> list = AStaticClass.GetList(); 
    } 
} 

在過去的代碼片段我要補充using System.Collections.Generic;爲它工作。

這是如何工作的?

+1

什麼是「不好」?你究竟是什麼意思? – Tigran 2012-08-15 11:30:51

+1

不編譯,編譯器會說未知類型'List '(或類似的東西)。 – 2012-08-15 11:31:47

回答

11

這是如何工作的?

當編譯器的類型推斷它與System.Collections.Generic.List<string>取代var並且代碼:

public class MyClass 
{ 
    public void MyMethod   
    { 
     System.Collections.Generic.List<string> list = AStaticClass.GetList(); 
    } 
} 

但由於編譯器吐IL,下面的C#程序(沒有任何using語句):

public class Program 
{ 
    static void Main() 
    { 
     var result = GetList(); 
    } 

    static System.Collections.Generic.List<string> GetList() 
    { 
     return new System.Collections.Generic.List<string>(); 
    } 
} 

Main方法看起來像這樣:

.method private hidebysig static void Main() cil managed 
{ 
    .entrypoint 
    .maxstack 8 
    L_0000: call class [mscorlib]System.Collections.Generic.List`1<string> Program::GetList() 
    L_0005: pop 
    L_0006: ret 
} 

正如您所見,編譯器從賦值運算符的右側推斷出類型,並將其替換爲完全限定類型名稱的var

3

編譯器實際上知道類型。即使你沒有使用編譯器縮短它,仍然可以用命名空間System.Collections.Generic.List<string>替換'var'的完整類型定義...就像你可以用沒有'using'指令的那一行定義你的變量一樣。