2012-01-05 129 views
-1

我正在寫一個專門的隨機化類,並希望使用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

回答

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

它沒有任何抱怨,如果我讓你maxValueint類型的獨立變量,而不是與max替換它。