C#:为什么范围的上限是互斥的?

Seb*_*ski 6 c# c#-8.0

C# 8 向 C# 添加了范围语法:

var slice = myArray[0..2];
Run Code Online (Sandbox Code Playgroud)

我发现不太直观的是上限(2在前面的示例中)是排他性的- 不包括在内;即myArray[0..2]返回具有 2 个元素(0 和 1)而不是 3 个元素的切片。

所以我的问题是:为什么C#语言设计者选择让上限独占?

无论是范围文档以及在设计冠军的问题只是状态上界是唯一的-不给任何解释,为什么(至少没有我能找到)。在 GitHub 上也有一个关于这个的讨论,但它似乎也没有包含任何官方解释。

通过搜索 StackOverflow,我偶然发现了 Python相同问题。Python 也将上限视为排他的。所以我可以想象 C# 语言设计者正在研究其他语言(有范围)并试图使 C# 的行为与其他语言保持一致。但我仍然想知道是否有关于这个决定的任何官方文件。

AAA*_*ddd 12

有很多设计决策不会有令人满意的答案。但是,这个至少有一个纸迹,您可以从以下链接开始的设计说明(在一个或多个提及中)中遵循。

注意:这只是一个武断的决定,他们选择排他的原因是因为他们选择了排他。由于利弊,情况很可能并非如此。

2018 年 1 月 22 日的 C# 语言设计说明

...

结论

让我们一起去..意味着排他性。由于我们选择专注于索引/切片场景,这似乎是正确的做法:

  • 它允许a.Length作为端点而无需加/减 1。
  • 它让一个范围的结束成为下一个不重叠的开始
  • 它避免了表格的丑陋空范围 x..x-1

正如@vc74在评论中提到的以及在提供的文档中所述,其他语言(如 Python)遵循此约定,但其他语言则没有。