[C#] Automatische Eigenschaften und Strukturen mischen nicht?


Answers

Sie können dies beheben, indem Sie zuerst den Standardkonstruktor aufrufen:

struct MyStruct 
{
    public MyStruct(int size) : this() 
    {
        this.Size = size; // <-- now works
    }

     public int Size { get; set; }
}
Question

Als ich diesen Beitrag beantwortete, stieß ich unerwartet auf einige kleine Strukturen:

Die folgende Struktur, die ein int-Feld verwendet, ist vollkommen legal:

struct MyStruct
{ 
    public MyStruct ( int size ) 
    { 
        this.Size = size; // <-- Legal assignment.
    } 

    public int Size; 
}

Die folgende Struktur, die eine automatische Eigenschaft verwendet, kompiliert jedoch nicht:

struct MyStruct
{ 
    public MyStruct ( int size ) 
    { 
        this.Size = size; // <-- Compile-Time Error!
    } 

    public int Size{get; set;}
}

Der zurückgegebene Fehler lautet "Das 'dieses' Objekt kann nicht verwendet werden, bevor alle seine Felder zugewiesen wurden". Ich weiß, dass dies eine Standardprozedur für eine Struktur ist: Das Hintergrundfeld für eine Eigenschaft muss direkt (und nicht über den Mengenaccessor der Eigenschaft) innerhalb des Konstruktors der Struktur zugewiesen werden.

Eine Lösung besteht darin, ein explizites Hintergrundfeld zu verwenden:

struct MyStruct
{ 
    public MyStruct(int size)
    {
        _size = size;
    }

    private int _size;

    public int Size
    {
        get { return _size; }
        set { _size = value; }
    }
}

(Beachten Sie, dass VB.NET dieses Problem nicht hat, da in VB.NET alle Felder bei der ersten Erstellung automatisch auf 0 / null / false initialisiert werden.)

Dies scheint eine unglückliche Einschränkung zu sein, wenn automatische Eigenschaften mit Strukturen in C # verwendet werden. Wenn ich konzeptionell überlege, frage ich mich, ob dies nicht ein vernünftiger Ort für eine Ausnahme wäre, die es erlaubt, den Property-Set-Accessor im Konstruktor einer Struktur aufzurufen, zumindest für eine automatische Eigenschaft?

Dies ist ein kleines Problem, fast ein Randfall, aber ich habe mich gefragt, was andere darüber denken ...