C#代码合约: How to validate parameters of interfacemethod defined in other assembly?

标签 c# parameters code-contracts

我遇到了一个情况,不知道该如何解决。 根据user manual第3节,契约(Contract)方法,即RequireEnsure , 不允许在重写方法/属性或接口(interface)实现中。合约方法应该在根虚拟/抽象方法中声明,并且由于您无法在抽象方法中声明代码,因此您必须使用 ContractClassAttributeContractClassForAttribute 。接口(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 已经指定了该前提条件。我只是尝试了一下以确保:“前提条件失败:索引 >= 0”

此外,据我了解,后置条件是允许的,只有先决条件不允许。

如果您仍想添加其他先决条件,我相信这可以回答您的问题: 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/

相关文章:

c# - 自定义代码合约异常消息

c# - 由契约(Contract)和 build 者设计

c# - 检测简单的触摸手势

c# - 在 WebAPI 中使用自定义 IHttpActionInvoker 进行异常处理

带有 getURL 和 RCurl 错误的 R API 连接(Localytics)

c# - 在类属性上使用 out 参数

C++ 类数组的神秘转移

c# - 上传 docx 损坏文件

c# - 滚动查看器阻塞事件

c# - 哪个第 3 方契约(Contract)代码库最像 MS 的 .NET 4.0 库?