2010-11-24 16 views
7

Por qué compilador de C# no permitirá compilar esto:Las diferencias entre las estructuras creadas por el usuario y las estructuras del marco en .NET

int a; 
Console.WriteLine(a); 

pero no permitirá compilar:

MyStruct a; 
Console.WriteLine(a); 

donde se define MyStruct como:

struct MyStruct 
{ 

} 

actualización: en las primeras caso el error es:

de error 1 El uso de variable local no asignada 'a'

+2

Ni ejemplo compila para mí (.NET 3.5). Además, 'int a;' no declara una estructura –

+1

@Anna: ¿Estás diciendo que 'int' /' Int32' no es una estructura? – LukeH

+0

es una pena que adivinemos el mensaje de error. –

Respuesta

11

C# no permite la lectura de los locales sin inicializar. He aquí un extracto de language specification que se aplica en este contexto:

5,3 asignación definitiva

...

Se considera que una variable de tipo struct definitivamente asignado si cada una de sus variables de instancia es considerado definitivamente asignado.


Claramente, ya que su estructura no tiene campos, esto no es un problema; se considera definitivamente asignado. Agregar un campo debería romper la compilación.

En una nota algo relacionada:

11.3.8 Constructores

Sin función miembro de instancia se puede llamar hasta que todos los campos de la estructura está construyendo han sido definitivamente asignado.

2

Al compilador simplemente no le gusta el hecho de que su entero se usa antes de inicializarse.

Error 5 Use of unassigned local variable 'a'  
4

Esto sucede debido a que una variable local int (a diferencia de un int como una clase o miembro de la estructura) no tiene ningún valor predeterminado. La salida struct en su ejemplo solo funciona porque no tiene miembros.

Los valores por defecto se discuten here.

Esto funcionaría:

struct MyStruct 
{ 
    int c; 
} 

int a = new int(); 
MyStruct b = new MyStruct(); 

Console.WriteLine(a); 
Console.WriteLine(b); 
Cuestiones relacionadas