Me gustaría aplicar una estructura para que siempre sea válida con respecto a un contrato determinado, impuesto por el constructor. Sin embargo, el operador default
viola el contrato.Cómo puedo hacer cumplir un contrato dentro de una estructura
considere lo siguiente, por ejemplo:
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
Como solución he cambiado de estructura a una clase para que pueda garantizar el constructor siempre se llama al inicializar una nueva instancia. Pero me pregunto, ¿hay absolutamente no hay forma de obtener el mismo comportamiento con una estructura?
Este en realidad es una buena solución para cumplir con la letra del contrato, aunque también necesitaría verificar int.MinValue. No recomendaría crear esta estructura, pero, si realmente quisiera hacerlo, esta es probablemente la solución más limpia. –
+1 truco inteligente. Sin embargo, puede ser bastante más difícil para contratos más complejos. –