Random.Next代码合同是否不正确?

时间:2011-07-06 12:04:22

标签: .net random code-contracts

我安装了一个插件(Microsoft的Code Contract Editor Extensions),它显示了.NET的所有代码合同。

当我查看Random.Next的合同时,它会显示ensures result <= maxValue,而MSDN声明maxValue是独占的。合同不应该说ensures result < maxValue吗?

2 个答案:

答案 0 :(得分:6)

它不是独占的,MSDN 并未声明它是。嗯,好吧,它在谈到maxValue时确实使用了“独家”这个词,这个词不太清楚,但实际情况是在绝大多数情况下它确实是排他性的预期

然而,有一些角落案例:具体的示例,Next(0)返回0; Next(4,4)返回4。当它没有选项时它是包含,这在MSDN的“返回值”部分中有记录:

引用Next(maxValue)

  

但是,如果maxValue等于零,则返回maxValue。

Next(minValue,maxValue)

  

如果minValue等于maxValue,则返回minValue。

(当然也可以说“maxValue已退回”)

因此,在这两种情况下,都可以返回maxValue

唯一的例外是无参数Next(),它被记录为严格< int.MaxValue

答案 1 :(得分:2)

由于MSDN中的合同比代码合同使用的合同更严格,代码合同使用的合同显然是正确的,但可能并不紧张。

另一方面,如果您要在自己的Next派生类中提供Random的自定义实现,则可能无法满足MSDN上指定的合同,但合同检查员不会注意到错误。因此,MS仍然建议消除两个合同版本之间的差异。

如果MSDN行为最初是一个错误,他们会改变代码以符合规范,我不会感到惊讶。

我建议您提交MS Connect问题,要求他们改进其中一个。

Next()

引用MSDN
  

大于或等于零且小于MaxValue的32位有符号整数。