Я хотел бы заставить структуру всегда быть действительной относительно определенного контракта, выполняемого конструктором. Однако контракт нарушается оператором default
.
Рассмотрим, например, следующее:
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
В качестве обходного пути я изменил свой struct на класс, чтобы гарантировать, что конструктор всегда вызывается при инициализации нового экземпляра. Но мне интересно, неужели нет абсолютно никакого способа получить такое же поведение со структурой?