2012-05-24 8 views
5

Los siguientes C# snippet compila y ejecuta bajo mi Visual Studio 2010:nuevo Foo {A = 1,} ¿Error o característica?

struct Foo { 
    public int A; 
} 

// .. 

var foo = new Foo { A = 1, }; 

Nota del coma final en el inicializador de objeto.

¿Es esto legal C# y tiene algún propósito útil, o acabo de golpear un error (benigno) del compilador?

Respuesta

9

Yes it is very much legal and useful in C# to have trailing commas and no it is not a (benign) compiler bug.

Microsoft añade que la función para la comodidad - es especialmente útil si se está generando código de programación si usted no tiene caso especial de la primera o la última opción. Encontrará una sintaxis similar en las declaraciones enum, asignando propiedades en la inicialización de objetos, matrices, listas, etc.

Permite que la coma final simplemente facilite una lista más uniforme de elementos en su inicializador que cambia la longitud con el tiempo Por ejemplo, dado que tiene esa coma allí, agregar un nuevo elemento al final solo implica editar una línea, y no editar una línea para agregar una coma y otra línea para agregar el nuevo contenido.

Por otra parte, ¿y si en comentario la última opción

enum Cars 
{ 
    Honda, 
    Hyundai, 
    //Ford 
} 

Ver la respuesta de Jon Skeet para .NET now support trailing comma in array like python does

Food for thought: If it had no use why would it be there in the first place?

+0

Es una característica común a todos los idiomas que uso. Funciona para la creación de matriz también. – Dunes

+0

Ahora que lo pones de esa manera, tiene mucho sentido. Gracias por la info! En cuanto a tu comentario: 'Si no tuviera uso, ¿por qué estaría ahí en primer lugar?' Veremos los errores de compilación de mi compilación (aunque no en C#), así que, aunque entiendo que es un "error de compilación" ocurrencia extremadamente rara, tiendo ** no ** a descartarlo de inmediato. –

4

Sería molesto si comentando el último elemento provocó un error de compilación :

var f = new Foo { 
    A = 1, 
// B = 4 
}; 

[Flags] 
enum Characteristics 
{ 
    None = 0, 
    Big = 1, 
// Strong = 2 
} 

var primes = new int[] { 
    2, 
    3, 
// 5 
}; 
0

Sí Es legal y no tiene un propósito específico.

Cuestiones relacionadas