我刚刚开始使用代码合约,虽然很有希望,但它们似乎在值类型方面有一些限制。例如:
public struct Wrap<T>
where T : class
{
readonly T value;
public Wrap(T value)
{
Contract.Requires(value != null);
this.value = value;
}
public T Value
{
get
{
Contract.Requires(Value != null);
return value;
}
}
[Pure]
[ContractInvariantMethod]
void Invariant()
{
Contract.Invariant(value != null);
}
public static T BigError()
{
Contract.Ensures(Contract.Result<T>() != null);
var x = default(Wrap<T>);
Contract.Assert(x.Value != null);
return x.Value;
}
}
Wrap.BigError 清楚地说明了这个问题。此示例编译并 ccheck 验证 4 个断言,但断言在运行时显然会失败。其中一些断言是多余的,我插入它们只是为了确保验证者在指定点检查这些属性。
我没有看到这种事情在MS 的代码合同文档中被列为已知问题,但它似乎太明显了,不能作为遗漏。我错过了什么吗?