我在代码契约中使用不变量时遇到了一个问题。我想在我的抽象类中定义一个不变的,但是它被忽略了。下面的代码显示了我的接口和抽象类。
[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);
}
}当我将不变量移到点类时,它工作得很好。所有其他的前或后条件也很好。
在抽象类中不可能有不变量,还是我做错了?
发布于 2015-03-20 12:47:41
接口不支持不变量。(您的问题标题是“抽象类中的不变量”,但问题的关键在于接口。)
我猜这是因为不变量需要状态,但是接口没有状态。我确信代码契约团队能够解决这个问题,我希望他们能够这样做,因为这将是一个很好的特性。
要解决这一限制,您可以:
class Point等)中。https://stackoverflow.com/questions/29123695
复制相似问题