Vorrei imporre una struttura per essere sempre valida per un determinato contratto, applicata dal costruttore. Tuttavia, il contratto viene violato dall'operatore default
.Come posso applicare un contratto all'interno di una struttura
Si consideri il seguente, ad esempio:
struct NonNullInteger
{
private readonly int _value;
public int Value
{
get { return _value; }
}
public NonNullInteger(int value)
{
if (value == 0)
{
throw new ArgumentOutOfRangeException("value");
}
_value = value;
}
}
// Somewhere else:
var i = new NonNullInteger(0); // Will throw, contract respected
var j = default(NonNullInteger); // Will not throw, contract broken
Come una soluzione Ho cambiato il mio struct a una classe in modo da poter garantire il costruttore è sempre chiamato durante l'inizializzazione di una nuova istanza. Ma mi chiedo, c'è assolutamente non c'è modo di ottenere lo stesso comportamento con una struct?
Questo è in realtà una buona soluzione per soddisfare la lettera del contratto, anche se sarebbe anche necessario verificare per int.MinValue. Non consiglierei di creare questa struttura, ma, se davvero volessi farlo, questa è probabilmente la soluzione più pulita. –
+1 Trucco intelligente. Può essere molto più difficile per i contratti più complessi. –