2008-10-01 112 views
5

我知道我們不能在課堂上做到這一點,但在方法層面上,我們總是可以做到這一點。爲什麼我們不能在課堂上申報var a = new List <string>?

var myList=new List<string> // or something else like this 

這個問題出現在我腦海裏,因爲我們只要聲明像這樣的變量。我們總是在表達式的RHS中提供類型信息。所以編譯器不需要進行類型猜測。 (糾正我,如果我錯了)。

所以問題仍然爲什麼不在一流水平,而其允許在方法層面

回答

6

實現此功能存在技術問題。常見的情況看起來很簡單,但更棘手的情況(例如,鏈接或循環中引用其他字段的字段,包含匿名類型的表達式)則不是。

見埃裏克利珀的博客,進行了深入的解釋:Why no var on fields?

5

編譯器的傢伙只是沒有落實支持。

這完全是編譯器的魔力,而編譯器實際上並沒有將某些東西放入IL中,它說「在運行時找出類型」,它知道類型並將其構建,因此它可以爲成員做到這一點好。它只是不。我很肯定,如果你問C#編譯器團隊中的一個真正的編譯器人員,你會得到一些官方的東西,但這裏沒有什麼奇妙的事情發生,應該可以對成員字段做同樣的事情。

+1

是的,它肯定能已經完成。我懷疑它不是爲了可讀性而實現的 - 將var的類型推斷限制爲局部變量意味着你只能在使用它的上下文中看到它。 – 2008-10-01 20:00:22

+0

這是不正確的。看到我的答案。涉及到技術問題。 – Brian 2009-05-17 16:30:19

1

var關鍵字是專門爲支持匿名類型而發明的。您通常不會在課堂級別聲明匿名類型,因此未實現。

你舉的例子聲明

var myList=new List<string> 

不是如何,因爲它不是爲預期目的使用var關鍵字一個很好的例子。

+1

我不同意。它可以通過減少冗餘來使代碼更清晰。 查看http://csharpindepth.com/ViewNote.aspx?NoteID=61 – 2008-10-01 20:36:00

0

它不是作爲方法實現VAR,因爲你還必須考慮到acccount不同的修飾符簡單和屬性,像這樣:

[MyAttribute()] protected internal readonly var list = new List<T>(); 

我真的已經喜歡是一種類型推斷的const

public const notFoundStatus = 404; // int 
0

通行證列表類型的通用

class Class1 
{ 
    public void genmethod<T>(T i,int Count) 
    { 


     List<string> list = i as List<string>; 

     for (int j = 0; j < Count; j++) 
     { 
      Console.WriteLine(list[j]); 
     } 
    } 
    static void Main(string[] args) 
    { 
     Class1 c = new Class1(); 
     c.genmethod<string>("str",0); 
     List<string> l = new List<string>(); 
     l.Add("a"); 
     l.Add("b"); 
     l.Add("c"); 
     l.Add("d"); 
     c.genmethod<List<string>>(l,l.Count); 

     Console.WriteLine("abc"); 
     Console.ReadLine(); 
    } 
} 
相關問題