【发布时间】:2021-01-13 16:52:37
【问题描述】:
C# 8 将范围语法添加到 C#:
var slice = myArray[0..2];
我发现不太直观的是上限(上例中为2)是独占 - 不是包含;即myArray[0..2] 返回一个包含 2 个元素(0 和 1)的切片,而不是 3 个元素。
所以我的问题是:为什么 C# 语言设计者选择让上限独占?
ranges documentation 和 design champion issue 都只是声明上限是排他性的 - 没有给出任何解释(至少我找不到)。还有a discussion about this on GitHub,但似乎也没有任何官方解释。
通过搜索 StackOverflow,我偶然发现了 same question for Python。 Python 还将上限视为排他性的。所以我可以想象 C# 语言设计者正在研究其他语言(具有范围)并试图使 C# 的行为与其他语言一致。但我仍然想知道是否有任何关于此决定的官方文件。
【问题讨论】:
-
如果有任何关于 SO 的任何人都可以提供的官方文档,它很可能会被正式记录在某个地方可以找到。所以我敢打赌,你也只会在这里猜到。我的是:因为它被解释为“从元素(开始)开始,给我一个数组(结束开始)的大小” - 所以在这种情况下,是一个二元素数组。
-
可能是因为它在使用从零开始的数组的范围时最有意义 -
0是开始,array.Length是结束。对于基于0的数组,maxIndex是Length - 1。这遵循同样的想法。另请注意,Random.Next(min, max)具有类似的约束条件(min包含,max不包含)。 -
EWD831 (Dijkstra, 1982)
-
因此您可以轻松地表示一个空范围等。从数学上讲,半开区间对于这种事情要好得多。