2010-12-14 85 views
7

En utilisant ce code:C# Struct Constructor Générique

struct Foo<T1> 
{ 
    public T1 Item1 { get; private set; } 

    public Foo(T1 item1) 
    { 
     Item1 = item1; 
    } 
} 

je rencontre cette erreur:

Backing field for automatically implemented property 'Foo.Item1' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.

Ma question est, pourquoi est la propriété Item1 pas entièrement attribué après que le constructeur est appelé?

Editer: Changé set à private set parce que cette question n'a rien à voir avec la mutabilité.

+10

Ne faites pas de structures mutables, s'il vous plaît. –

+0

Pourquoi pas lui? Cela rend les choses beaucoup plus simples parfois, et peut améliorer les performances un peu dans certains cas de boucle. Quel est le problème avec les structures mutables? (Cela ne répond pas non plus à sa question.) – Mehrdad

+0

@Lambert http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil –

Répondre

15

Ajouter this() ici:

public Foo(T1 item1) : this() 
{ 
    Item1 = item1; 
} 

C'est parce que vous affectez à une propriété, et le compilateur ne peut pas en déduire que la propriété ne attribue une valeur à une variable; il pourrait faire d'autres choses avant que l'instance ne soit initialisée, et cela n'est pas autorisé car la structure pourrait avoir des données parasites. Vous devez donc d'abord l'initialiser avec le constructeur par défaut, puis faire ce que vous voulez.

+0

@Lambert: la question est, pourquoi ne pas le compilateur voir l'évidence? Le compilateur fait un bon travail d'analyse de flux dans d'autres cas. – Vlad

+0

Je n'ai pas fait le compilateur, donc je ne sais pas. :) Mais cela empêche d'autres situations où la propriété n'est pas générée automatiquement et où vous essayez d'utiliser des données parasites. En outre, je crois que cela est probablement un problème CLR, pas un problème de compilateur - le JIT peut se plaindre si vous essayez d'accéder à une propriété avant que l'instance est initialisé, car il ne dispose pas d'informations que le compilateur a immédiatement disponible pour il. – Mehrdad

+0

Vous pouvez également résoudre ce problème en implémentant explicitement votre propre constructeur par défaut. –