C#:为什么范围的上限是独占的?

C#: Why is the upper bound of ranges exclusive?

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

var slice = myArray[0..2];

我觉得不太直观的是上限(上例中的2)是不包含 - 不是包含;即 myArray[0..2] returns 包含 2 个元素(0 和 1)的切片,而不是包含 3 个元素的切片。

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

两者都是ranges documentation as well as the design champion issue simply state that the upper bound is exclusive - without giving any explanation as to why (at least none that I could find). There also was a discussion about this on GitHub,但它似乎也没有包含任何官方解释。

通过搜索 Whosebug,我偶然发现了 same question for Python。 Python 也将上限视为独占。所以我可以想象 C# 语言设计者正在研究其他语言(具有范围)并试图使 C# 的行为与其他语言一致。但我仍然想知道是否有任何关于此决定的官方文档。

有很多设计决策不会有令人满意的答案。然而,这个至少有一个 paper-trail 你可以在设计说明中遵循(在一个或多个提及中)从以下 link.

开始

注意 : 这只是一个随意的决定,他们选择独占的原因是因为他们选择了独占。由于利弊,很可能不是这样。

C# Language Design Notes for Jan 22, 2018

...

Conclusion

Let us go with .. means exclusive. Since we've chosen to focus on the indexing/slicing scenario, this seems the right thing to do:

  • It allows a.Length as an endpoint without adding/subtracting 1.
  • It lets the end of one range be the beginning of the next without overlap
  • It avoids ugly empty ranges of the form x..x-1

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