我正在编写一个专门的随机数发生器类,并希望使用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在最后一次“确认”时失败了?
答案 0 :(得分:2)
我无法重现你的问题。代码合同不会抱怨以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics.Contracts;
namespace ContractModulo
{
class Program
{
UInt32 Pick()
{
return 0;
}
public int Next(int max)
{
Contract.Requires<ArgumentOutOfRangeException>(0 <= max && max <= int.MaxValue);
Contract.Ensures(0 <= Contract.Result<int>());
Contract.Ensures(Contract.Result<int>() < max);
return (int)(Pick() % max);
}
static void Main(string[] args)
{
}
}
}
如果我将maxValue
作为int
类型的单独变量而不是将其替换为max
,则不会抱怨。