2011-03-09 73 views
17
void Main() 
{ 
    Test t = new Test 
    { 
     A = "a", 
     B = "b", // <-- erroneous trailing comma 
    }; 
} 

public class Test 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
} 

我在代碼中發現上述錯別字很多。我總是很驚訝,編譯器似乎並不在乎這一點。爲什麼上述不是語法錯誤?有沒有真正有效的用途?內聯屬性初始化和尾隨逗號

+2

爲什麼*應該*它是一個語法錯誤?在最後一個語句的末尾添加分號沒有問題,對吧?所以我沒有看到在最後一個初始化程序結束時輸入逗號有什麼問題。 – Gabe 2011-03-09 11:38:50

回答

17

我在我的代碼中發現了上面的錯字頗多。我總是很驚訝,編譯器似乎並不在乎這一點。爲什麼上述不是語法錯誤?

因爲人們在設計C#語法文法都足夠聰明,從沒有允許懸掛逗號,在這些語言的編程人員的不斷刺激其他編程語言學習的功課。例如,ECMAScript(JavaScript)最初沒有提到這個問題,所以有些實現(Firefox中的SpiderMonkey,Opera的JavaScript等)允許它們,而其他實現(微軟的JScript)則沒有。所以這導致了「爲什麼IE不能在IE中工作」這個問題和其他問題。 (幸運的是,ECMAScript 5明確允許它們,IE8最終在對象初始化器中支持它們 - IE8仍然以非標準的方式處理數組初始化器,但公平起見,這些懸而未決的逗號只能在ECMAScript 5中闡明。)

您也可以在C#語法的其他地方找到它,例如枚舉和數組初始值設定項。

4

這不是一個錯誤,因爲它很方便。要添加到初始化程序中,只需添加一行而不是將一個逗號添加到一行,然後輸入一整行新行。

這實際上在其他語言的列表/數組初始化中也很常見(Python,Ruby,Haskell)。

5

我認爲它可以簡化自動代碼生成。

在這種情況下,你可以有某種程序的創建這樣

... 
for(char c = 'A'; c < 'Z'; c++) 
{ 
    AddToOutput(c + " = \"+c.ToLower()+"\","); 
} 
... 

代碼,並沒有在意刪除最後結尾的逗號。