我安装了一个插件(Microsoft的Code Contract Editor Extensions),它显示了.NET的所有代码合同。
当我查看Random.Next
的合同时,它会显示ensures result <= maxValue
,而MSDN声明maxValue是独占的。合同不应该说ensures result < maxValue
吗?
答案 0 :(得分:6)
它不是独占的,MSDN 并未声明它是。嗯,好吧,它在谈到maxValue
时确实使用了“独家”这个词,这个词不太清楚,但实际情况是在绝大多数情况下它确实是排他性的预期
然而,有一些角落案例:具体的示例,Next(0)
返回0
; Next(4,4)
返回4
。当它没有选项时它是包含,这在MSDN的“返回值”部分中有记录:
但是,如果maxValue等于零,则返回maxValue。
如果minValue等于maxValue,则返回minValue。
(当然也可以说“maxValue
已退回”)
因此,在这两种情况下,都可以返回maxValue
。
唯一的例外是无参数Next()
,它被记录为严格< int.MaxValue
。
答案 1 :(得分:2)
由于MSDN中的合同比代码合同使用的合同更严格,代码合同使用的合同显然是正确的,但可能并不紧张。
另一方面,如果您要在自己的Next
派生类中提供Random
的自定义实现,则可能无法满足MSDN上指定的合同,但合同检查员不会注意到错误。因此,MS仍然建议消除两个合同版本之间的差异。
如果MSDN行为最初是一个错误,他们会改变代码以符合规范,我不会感到惊讶。
我建议您提交MS Connect问题,要求他们改进其中一个。
为Next()
大于或等于零且小于MaxValue的32位有符号整数。