Кодовые контракты: инварианты в абстрактном классе
Я столкнулся с проблемой при использовании инвариантов с кодовыми контрактами. Я хочу определить Инвариант в моем абстрактном классе, но он просто игнорируется. Код ниже показывает мой интерфейс и абстрактный класс.
[ContractClass(typeof(IPointContract))]
interface IPoint
{
int X { get; }
int Y { get; }
}
[ContractClassFor(typeof(IPoint))]
abstract class IPointContract : IPoint
{
public int X
{
get { return 0; }
}
public int Y
{
get { return 0; }
}
[ContractInvariantMethod]
private void PointInvariant()
{
Contract.Invariant(X > Y);
}
}
После этого я реализую этот интерфейс в своем классе Point и создаю из него объект. Это должно по крайней мере потерпеть неудачу во время выполнения.
class Point : IPoint
{
public Point(int X, int Y)
{
this._x = X;
this._y = Y;
}
private int _x;
public int X
{
get { return _x; }
}
private int _y;
public int Y
{
get { return _y; }
}
}
class Program
{
static void Main(string[] args)
{
Point p = new Point(1, 2);
}
}
Когда я перемещаю Инвариант в Point-Class, он работает нормально. Все остальные предварительные или последующие условия тоже работают нормально.
Разве невозможно иметь инварианты в абстрактном классе или я делаю это неправильно?