2010-12-14 17 views
7

Stosując ten kod:Struct C# Generic Konstruktor

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

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

napotykam ten błąd:

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.

Moje pytanie brzmi, dlaczego jest właściwość Item1 nie w pełni przydzielony po konstruktora nazywa?

Edytuj: Zmieniono set na private set, ponieważ to pytanie nie ma nic wspólnego z zmiennością.

+10

Nie należy tworzyć struktur zmiennych, proszę. –

+0

Dlaczego nie powinien? To sprawia, że ​​czasami jest o wiele prostsze i może poprawić wydajność w niektórych przypadkach wymagających dużej ilości pętli. Co jest nie tak z zmiennymi strukturami? (To też nie odpowiada na jego pytanie.) – Mehrdad

+0

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

Odpowiedz

15

Dodaj this() tu:

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

To dlatego jesteś przypisywanie do nieruchomości, a kompilator nie może wywnioskować, że nieruchomość tylko przypisuje wartość do zmiennej; może zrobić inne rzeczy przed inicjalizacją instancji, a to nie jest dozwolone, ponieważ struktura może zawierać dane śmieci. Musisz najpierw zainicjować go za pomocą domyślnego konstruktora, a następnie zrobić to, co chcesz.

+0

@Lambert: pytanie brzmi, dlaczego kompilator nie może zobaczyć rzeczy oczywistych? Kompilator wykonuje całkiem dobrą robotę analizy przepływu w innych przypadkach. – Vlad

+0

Nie zrobiłem kompilatora, więc nie wiem. :) Ale zapobiega innym sytuacjom, w których właściwość nie jest autogenerowana i gdzie próbujesz użyć danych ze śmieci. Sądzę, że jest to prawdopodobnie problem CLR, a nie kompilator - JIT może uskarżać się, jeśli spróbujesz uzyskać dostęp do właściwości przed inicjalizacją instancji, ponieważ nie ma informacji, które kompilator ma od razu do dyspozycji. to. – Mehrdad

+0

Możesz także rozwiązać ten problem, jawnie implementując własny domyślny konstruktor. –