コンストラクターによって強制される、特定の契約に関して常に有効になるように構造体を強制したいと思います。しかし、契約は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
回避策として、構造体をクラスに変更して、新しいインスタンスを初期化するときにコンストラクターが常に呼び出されるようにしました。しかし、構造体で同じ動作を得る方法は絶対にないのだろうか?