2011-03-09 20 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; } 
} 

Encuentro el error de más arriba en mi código bastante. Siempre me sorprende que al compilador no parezca importarle esto. ¿Por qué lo anterior no es una sintaxis errror? ¿Hay algún uso realmente válido para eso?Inicialización de propiedades en línea y coma final

+2

¿Por qué * debería * ser un error de sintaxis? No hay problema para poner un punto y coma al final de su última declaración, ¿verdad? Así que no veo nada de malo al poner una coma al final de su último inicializador. – Gabe

Respuesta

17

Encuentro el error de más arriba en mi código bastante. Siempre me sorprende que al compilador no parezca importarle esto. ¿Por qué lo anterior no es una sintaxis errror?

Debido a que las personas que diseñan la gramática sintaxis de C# eran lo suficientemente inteligente como para aprender las lecciones de otros lenguajes de programación, que no hizo permiten la coma colgando, a la irritación constante de programadores en esos idiomas. Por ejemplo, ECMAScript (JavaScript) guardó silencio sobre el problema inicialmente, y así que, naturalmente, algunas implementaciones (SpiderMonkey en Firefox, JavaScript de Opera, etc.) las permitieron, mientras que otras (JScript de Microsoft) no lo hicieron. Y esto dio lugar a una avalancha de preguntas sobre "por qué esto no funciona en IE" aquí y en otros lugares. (Afortunadamente, ECMAScript 5 los permite explícitamente, e IE8 finalmente los admite en los inicializadores de objetos: IE8 todavía trata los inicializadores de matriz de una manera no estándar, aunque para ser justos, la coma que colgaba solo se aclaró en ECMAScript 5).

Esto también se encuentra en muchos otros lugares de la gramática C#, como las enumeraciones y los inicializadores de matriz.

4

No es un error porque es conveniente. Para agregar al inicializador, solo tiene que agregar una línea en lugar de agregar una coma a una línea e ingresar una línea completamente nueva.

Esto es realmente bastante común en la inicialización de lista/matriz en otros idiomas (me vienen a la mente Python, Ruby, Haskell).

5

Creo que está permitido simplificar la generación automática de código.

En este caso, puede tener algún tipo de su programa de creación de código como este

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

y no tienen que preocuparse por la eliminación de la última coma final.

Cuestiones relacionadas