Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 随机。下一个代码合同不正确吗?_.net_Random_Code Contracts - Fatal编程技术网

.net 随机。下一个代码合同不正确吗?

.net 随机。下一个代码合同不正确吗?,.net,random,code-contracts,.net,Random,Code Contracts,我安装了一个插件(微软的代码契约编辑器扩展),它显示了.NET的所有代码契约 当我查看合同的Random.Next它说确保结果因为MSDN中的合同比代码合同使用的合同更严格,代码合同使用的合同显然是正确的,但可能不严格 另一方面,如果要在自己的Random派生类中提供Next的自定义实现,它可能无法实现MSDN上指定的契约,但契约检查器不会注意到错误。因此,MS仍然建议消除两个合同版本之间的差异 如果MSDN行为最初是一个错误,然后他们更改代码以符合规范,我不会感到惊讶 我建议您提出MS Con

我安装了一个插件(微软的代码契约编辑器扩展),它显示了.NET的所有代码契约


当我查看合同的
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的内容来改进合同