2010-11-24 4 views
7

Pourquoi le compilateur C# ne vous permet pas de compiler ceci:Les différences entre les struct créés par l'utilisateur et struct cadre dans .NET

int a; 
Console.WriteLine(a); 

mais ne vous permettent d'établir:

MyStruct a; 
Console.WriteLine(a); 

où MyStruct est défini comme:

struct MyStruct 
{ 

} 

Mise à jour: dans les premiers cas, l'erreur est:

Erreur 1 Utilisation de la variable locale unassigned 'a'

+2

Aucun exemple pour moi compile (.NET 3.5). Aussi, 'int a' ne déclare pas de struct. –

+1

@Anna: Voulez-vous affirmer que 'int' /' Int32' n'est pas une structure? – LukeH

+0

c'est dommage que nous devions deviner le message d'erreur. –

Répondre

11

C# ne permet pas la lecture de la population locale non initialisée. Voici un extrait de language specification qui s'applique dans ce contexte:

5,3 Affectation Definite

...

Une variable de type struct est considéré définitivement attribué si chacun de ses variables d'instance est considéré définitivement attribué.


Il est clair que, depuis votre struct n'a pas de champ, ce n'est pas un problème; il est considéré comme définitivement attribué. L'ajout d'un champ devrait casser la construction.

Sur une note un peu connexe:

11.3.8 Constructors

Aucune instance fonction membre peut être appelé jusqu'à ce que tous les champs de la struct en cours de construction ont été définitivement attribué.

2

Le compilateur n'aime tout simplement pas le fait que votre entier est utilisé avant d'être initialisé.

Error 5 Use of unassigned local variable 'a'  
4

Cela se produit parce qu'une int variable locale (contrairement à un int en tant que membre du groupe ou struct) n'a pas de valeur par défaut. La sortie struct dans votre exemple ne fonctionne que parce qu'elle n'a aucun membre.

Valeurs par défaut discutées here.

Cela fonctionnerait:

struct MyStruct 
{ 
    int c; 
} 

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

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