3

我对代码合同相当陌生,所以我可能在这里做了一些愚蠢的事情:)

我收到错误

检测到的表达式语句评估了方法“##”的合同中的潜在副作用。(您的意思是将表达式放入 Requires、Ensures 或 Invariant 调用中吗?)

我有以下合同

Contract.Requires<ArgumentNullException>(obj != null);
Contract.Requires<ArgumentNullException>(obj.Id != null);

它在第二份合同上失败obj.Id != nullId是 a Guid

现在有可能Idnull方法中不允许的。但是代码契约引发了上述编译错误。它自己的方法实际上并没有返回任何东西,因此也不需要确保。

我已经删除了合同,所以我可以编译并放置一个标准if检查。但这是什么原因造成的?

4

1 回答 1

2

您需要将 Id 属性本身标记为[Pure]

这将告诉代码契约分析器它没有副作用。

代码契约不喜欢你调用有副作用的方法;根据您是否启用了代码合同检查,您的代码的行为会有所不同,这将是一件坏事。

例子:

public Guid Id
{
    [Pure]
    get
    {
        return _id;
    }
}

Id还有一点:如果它是 Guid,怎么可能为null?Guid 是一个结构,因此它不能为空。它可能是一个可为空的 Guid (ie Guid?) 吗?

于 2013-03-13T10:27:35.633 回答