CodeContracts on modulus(%)运算符失败?

时间:2012-01-05 16:12:15

标签: c# .net random code-contracts modulus

我正在编写一个专门的随机数发生器类,并希望使用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在最后一次“确认”时失败了?

1 个答案:

答案 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,则不会抱怨。