Как я могу обеспечить выполнение контракта внутри структуры

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

6
задан user703016 27 November 2011 в 18:06
поделиться