【发布时间】:2012-01-05 16:12:14
【问题描述】:
我正在编写一个专门的随机生成器类,并希望使用 CodeContracts 确保它的质量。一个典型的随机化器方法接收一个上限“max”并返回一个低于该限制的正随机值。
public int Next(int max)
{
Contract.Requires<ArgumentOutOfRangeException>(0 <= max && max <= int.MaxValue);
Contract.Ensures(0 <= Contract.Result<int>());
Contract.Ensures(Contract.Result<int>() < maxValue);
return (int)(pick() % maxValue);
}
其中pick() 返回一个随机的UInt32。我的问题:为什么 CodeContracts 在最后一个“确保”时会失败?
【问题讨论】:
-
可能是因为
maxValue != max. -
如果
max==0您的代码抛出异常。您的max参数的命名也很糟糕,因为它不代表最大值,而是最大值加一。 -
您的代码甚至无法编译。你有一个
max和一个maxValue。 -
maxValue 是全局变量吗?
-
@KevinCrowell 即使它是
int类型的全局变量,代码合同也不会抱怨。
标签: c# .net random code-contracts modulus