模数(%)运算符上的CodeContracts失败

本文关键字:CodeContracts 失败 运算符 模数 | 更新日期: 2023-09-27 18:19:28

我正在编写一个专门的随机化器类,并希望使用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);
}

其中CCD_ 1返回随机的CCD_。我的问题是:为什么CodeContracts在最后一个"确保"时失败?

模数(%)运算符上的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替换它,也不会有什么抱怨。