我遇到了一个情况,不知道该如何解决。
根据user manual第3节,契约(Contract)方法,即Require
或Ensure
, 不允许在重写方法/属性或接口(interface)实现中。合约方法应该在根虚拟/抽象方法中声明,并且由于您无法在抽象方法中声明代码,因此您必须使用 ContractClassAttribute
和ContractClassForAttribute
。接口(interface)成员的契约方法(及其实现)也是如此。
但是如果我想使用一个不是我自己创建的界面怎么办?例如IList<T>
没有实现这些合约方法,但我无法设置 ContractClassAttribute
就它而言。我应该如何在 IList<T>.this[int]
的实现中进行参数验证?不允许使用以下解决方案:
T IList<T>.this[int i]
{
get
{
Contract.Requires(i >= 0);//not allowed
if (i < 0)
throw new ArgumentException();
Contract.EndContractBlock();//also not allowed
...
}
}
遗留的 if-then-throw 语句是否没有 EndContractBlock
唯一的解决方案?
最佳答案
首先,IList
此外,据我了解,后置条件是允许的,只有先决条件不允许。
如果您仍想添加其他先决条件,我相信这可以回答您的问题: http://social.msdn.microsoft.com/Forums/en/codecontracts/thread/af403bbc-ca4e-4546-8b7a-3fb3dba4bb4a
这基本上可以归结为这样一个事实:您不应该这样做,因为这会违背代码契约的目的。
关于C#代码合约: How to validate parameters of interfacemethod defined in other assembly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4985719/