CodeContracts模数(%)操作失败?
问题描述:
我正在写一个专门的随机化类,并希望使用CodeContracts来确保它的质量。典型的随机函数发生器方法会接收一个上限“max”,并返回低于该限制的正随机值。CodeContracts模数(%)操作失败?
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在最后的“确保”上失败?
答
我无法重现您的问题。代码合同不抱怨以下代码:
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
替换它。
可能是因为'maxValue!= max'。 – 2012-01-05 17:28:52
如果'max == 0',你的代码会抛出一个异常。你的'max'参数也被错误地命名,因为它不代表最大值,而是最大值加1。 – CodesInChaos 2012-01-05 20:05:18
你的代码甚至无法编译。你在那里有一个'max'和一个'maxValue'。 – CodesInChaos 2012-01-05 20:08:07