.net 随机。下一个代码合同不正确吗?
我安装了一个插件(微软的代码契约编辑器扩展),它显示了.NET的所有代码契约.net 随机。下一个代码合同不正确吗?,.net,random,code-contracts,.net,Random,Code Contracts,我安装了一个插件(微软的代码契约编辑器扩展),它显示了.NET的所有代码契约 当我查看合同的Random.Next它说确保结果因为MSDN中的合同比代码合同使用的合同更严格,代码合同使用的合同显然是正确的,但可能不严格 另一方面,如果要在自己的Random派生类中提供Next的自定义实现,它可能无法实现MSDN上指定的契约,但契约检查器不会注意到错误。因此,MS仍然建议消除两个合同版本之间的差异 如果MSDN行为最初是一个错误,然后他们更改代码以符合规范,我不会感到惊讶 我建议您提出MS Con
当我查看合同的
Random.Next
它说确保结果因为MSDN中的合同比代码合同使用的合同更严格,代码合同使用的合同显然是正确的,但可能不严格
另一方面,如果要在自己的Random
派生类中提供Next
的自定义实现,它可能无法实现MSDN上指定的契约,但契约检查器不会注意到错误。因此,MS仍然建议消除两个合同版本之间的差异
如果MSDN行为最初是一个错误,然后他们更改代码以符合规范,我不会感到惊讶
我建议您提出MS Connect问题,要求他们改进其中一个
为Next()引用MSDN
大于或等于零且小于MaxValue的32位有符号整数
它不是排他性的,MSDN也没有声明它是排他性的。好吧,在谈论maxValue
时,它确实使用了“排他”一词,这一点不太清楚,但事实是,在绝大多数情况下,它确实如预期的那样是排他的
然而,也有一些特殊情况:具体来说,示例是,Next(0)
返回0
Next(4,4)
返回4
。如果没有选项,则包含在内,并记录在MSDN的“返回值”部分:
引自:
但是,如果maxValue等于零,则返回maxValue
和来自:
如果minValue等于maxValue,则返回minValue
(当然也可以声明“maxValue
已返回”)
因此,在这两种情况下,maxValue
都有可能返回
唯一的例外是无参数的Next()
,它被严格记录为
是。传闻该合同将于2012年失效。假设MSDN是正确的。根据我的经验,这远非总是正确的,而且出于某种原因,似乎要花上十年的大部分时间才能应用最微小的修复MSDN@Hans我猜你是在开玩笑。但是:当实际合同更严格时,合同怎么可能失败呢?@jalf MSDN和合同都是100%正确的;这里唯一的错误是“MSDN声明maxValue是独占的”——它没有这样说。@jgauffin它可以更好地表述为“通常独占”;pNo,OP只是误述了MSDN;MSDN明确声明它可以是包含性的(参见我的答案)@Marc对于无参数Next
MSDN保证结果小于int.MaxValue
@Marc gravel:不,我没有错述它,正如我在对你的答案和我的问题的评论中解释的那样;)@jgauffin好吧好吧,我明白了-maxValue
提到了“独家”这个词,很好-我听到了。这也许是误导;但它也澄清了“返回值”备注中的边缘条件。是的,它可以用更好的措辞,但从整体上看,MSDN确实试图明确它不是严格的排他性的。是的。我知道。我在评论中遗漏了那一部分。这就是为什么你的回答帮助了我,希望其他人也发现了同样的事情。我刚刚阅读了参数说明返回的随机数的唯一上限
。因此,最小/最大过载是互斥的,除非两个参数使用相同的值。这就解释了这个契约。我假设OP讨论的是无参数的Next
,它确实保证了结果小于int.MaxValue
@jgauffin;但这意味着从合同的角度来看,只能说它是@CodeInChaos:不,我说的是最小/最大过载。很抱歉在我的问题中没有足够清楚。即使对于Next(maxValue)
重载,也可以通过添加类似maxValue==0 | | result的内容来改进合同