Perché C # 4.0 tollera la virgola finale nel codice di inizializzazione degli oggetti anonimi?

Possibile duplicato:
Inizializzazione proprietà inline e virgola finale

Lavorando su uno dei miei progetti (C # 4.0, Visual Studio 2010), ho scoperto per sbaglio quel codice

var obj = new { field1 = "Test", field2 = 3, } 

è compilato ed eseguito OK senza errori o persino avvertimenti e funziona esattamente come

 var obj = new { field1 = "Test", field2 = 3 } 

Perché il compilatore tollera il coma finale nel primo esempio? È un bug nel compilatore o un simile comportamento ha qualche scopo?

Grazie

Per determinare se si tratta di un bug nel compilatore, è necessario consultare la specifica C # – in questo caso la sezione 7.6.10.6, che consente chiaramente:

 anonymous-object-creation-expression: new anonymous-object-initializer anonymous-object-initializer: { member-declarator-listopt } { member-declarator-list , } 

Quindi no, non è un bug del compilatore. Il linguaggio è stato deliberatamente progettato per consentirlo.

Per quanto riguarda il motivo per cui il linguaggio è stato progettato in questo modo, credo che sia più facile aggiungere e rimuovere valori durante la codifica. Per esempio:

 var obj = new { field1 = "test", field2 = 3, }; 

può diventare

 var obj = new { field2 = 3, }; 

o

 var obj = new { field1 = "test", field2 = 3, field3 = 4, }; 

unicamente aggiungendo o rimuovendo una linea. Ciò rende più semplice mantenere il codice e anche più facile scrivere generatori di codice.

Si noti che questo è coerente con gli inizializzatori di array, gli inizializzatori di raccolta e le enumerazioni:

 // These are all valid string[] array = { "hello", }; List list = new List { "hello", }; enum Foo { Bar, } 

Una delle ragioni per cui le virgolette finali è buona è a causa di Source Compares. Se aggiorni la fonte e usi uno strumento di confronto sorgente, lo strumento di confronto sorgente mostrerà solo 1 riga modificata (il nuovo campo 3. Se non ci fosse una virgola finale, il confronto sorgente mostrerà 2 linee modificate perché dovevi aggiungere la virgola dopo il numero 3.

 var obj = new { field1 = "Test", field2 = 3, } var obj = new { field1 = "Test", field2 = 3, field3 = "New", } 

Per rendere più facile l’eliminazione dell’ultimo campo, suppongo. Non c’è davvero alcuna ambiguità introdotta nella syntax facendo così, quindi rende la vita un po ‘più semplice.