2010-03-02 13 views
9

Pregunta tonta, pero ¿por qué compila la siguiente línea?¿Por qué es legal este fragmento de C#?

int[] i = new int[] {1,}; 

Como se puede ver, no han entrado en el segundo elemento y la izquierda una coma allí. Aún compila, aunque es de esperar que no lo haga.

+4

http://stackoverflow.com/questions/2311864/history-of-trailing-comma-in-programming-language-grammars –

+0

Estoy sorprendido de que nadie sería satisfecho con la respuesta "Porque eso es lo que dice la especificación". Las respuestas de Steck y Jimmy explican * por qué es beneficioso *. –

+0

Lo voté porque me impresionó la flecha .... – Jimmy

Respuesta

11

supongo que por el estándar ECMA 334 dice:

array-initializer: 
    { variable-initializer-list(opt) } 
    { variable-initializer-list , } 
variable-initializer-list: 
    variable-initializer 
    variable-initializer-list , variable-initializer 
variable-initializer: 
    expression 
    array-initializer 

Como se puede ver, se permite que la coma final:

{ variable-initializer-list , } 
          ↑ 

P. S. para una buena respuesta (incluso si este hecho ya fue señalado por muchos usuarios). :)

La coma al final podría utilizarse para facilitar la implementación de generadores de códigos automáticos (los generadores pueden evitar probar el último elemento en el inicializador, ya que debe escribirse sin la coma final) y la inicialización de matriz condicional con preprocesadores.

7

Debe compilar por definición.

No hay un segundo elemento. Una coma final es una sintaxis válida al definir una colección de elementos.

i es una matriz de int que contiene un solo elemento, i[0] que contiene el valor 1.

+0

Esa coma adicional me dice que se espera otro valor. –

+7

Esa puede ser su interpretación, pero no es así como se define. –

+0

Ese puede ser el caso, pero aún no tiene ningún sentido, independientemente de la especificación. –

5

es así que puede hacer esto y copiar/pegar líneas sin preocuparse por eliminar o agregar las comas en los lugares correctos.

int[] i = new[] { 
    someValue(), 
    someOtherValue(), 
    someOtherOtherValue(), 

    // copy-pasted zomg! the commas don't hurt! 
    someValue(), 
    someOtherValue(), 
    someOtherOtherValue(), 

}; 
+0

De acuerdo con una publicación similar que jleedevpointed out, es para facilitar la generación automática de código. Acabo de atraparme por supuesto, eso es todo :-) –

10

Esta es la sintaxis de azúcar. En particular, tal registro puede ser útil en la generación de código.

int[] i = new int[] { 
    1, 
    2, 
    3, 
}; 

También, cuando se escribe así, para añadir nueva línea es necesario agregar sólo texto en una sola línea.

+1

Es molesto que esto esté permitido en las matrices, pero no en los Enums, donde serían mucho más útiles. –

+3

está permitido en enumeraciones (simplemente intenté en C# 3.0) –

+0

IMO, esta y la respuesta de Jimmy deben editarse juntas y luego se acepta el resultado. Y agregaría la observación de que así es como ';' funciona entre enunciados, por exactamente la misma razón. Y eso en Erlang, donde el símbolo final es diferente (un punto en lugar de una coma), al principio puede parecer muy similar al inglés, pero los usuarios terminan odiando por las mismas razones dadas aquí. –

7

Otra ventaja de permitir una coma final es en combinación con las directivas de preprocesador:

int[] i = new[] { 
#if INCLUDE1 
    1, 
#endif 

#if INCLUDE2 
    2, 
#endif 

#if INCLUDE3 
    3, 
#endif 
}; 

sin permitir un coma final, que sería mucho más difícil de escribir.

3

Lo mismo va para las enumeraciones:

enum Foo 
{ 
    Bar, 
    Baz, 
}; 
Cuestiones relacionadas