[c#] Proprietà e strutture automatiche non si mescolano?



Answers

Puoi risolvere questo problema chiamando prima il costruttore predefinito:

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

     public int Size { get; set; }
}
Question

Girando attorno a delle piccole strutture mentre rispondevo a questo post , mi sono imbattuto in ciò che segue in modo imprevisto:

La seguente struttura, utilizzando un campo int, è perfettamente legale:

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

    public int Size; 
}

Tuttavia, la seguente struttura, che utilizza una proprietà automatica, non viene compilata:

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

    public int Size{get; set;}
}

L'errore restituito è "L'oggetto 'questo' non può essere utilizzato prima che tutti i suoi campi siano assegnati a". So che questa è una procedura standard per una struttura: il campo di supporto per qualsiasi proprietà deve essere assegnato direttamente (e non tramite l'accessor set della proprietà) all'interno del costruttore della struct.

Una soluzione è usare un campo di backing esplicito:

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

    private int _size;

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

(Si noti che VB.NET non avrebbe questo problema, perché in VB.NET tutti i campi sono automaticamente inizializzati su 0 / null / false alla prima creazione.)

Questo sembrerebbe essere una sfortunata limitazione quando si usano le proprietà automatiche con le strutture in C #. Pensando concettualmente, mi chiedevo se questo non sarebbe stato un posto ragionevole in cui ci sarebbe stata un'eccezione che consentisse di chiamare l'accessor set di proprietà all'interno di un costruttore di struct, almeno per una proprietà automatica?

Questo è un problema minore, quasi un caso limite, ma mi chiedevo cosa ne pensassero gli altri di questo ...




Related