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在最后的“确保”上失败?

+1

可能是因为'maxValue!= max'。 – 2012-01-05 17:28:52

+0

如果'max == 0',你的代码会抛出一个异常。你的'max'参数也被错误地命名,因为它不代表最大值,而是最大值加1。 – CodesInChaos 2012-01-05 20:05:18

+1

你的代码甚至无法编译。你在那里有一个'max'和一个'maxValue'。 – CodesInChaos 2012-01-05 20:08:07

我无法重现您的问题。代码合同不抱怨以下代码:

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) 
     { 
     } 
    } 
} 

它没有任何抱怨,如果我让你maxValueint类型的独立变量,而不是与max替换它。