【问题标题】:C#: Why is the upper bound of ranges exclusive?C#:为什么范围的上限是排他的?
【发布时间】:2021-01-13 16:52:37
【问题描述】:

C# 8 将范围语法添加到 C#:

var slice = myArray[0..2];

我发现不太直观的是上限(上例中为2)是独占 - 不是包含;即myArray[0..2] 返回一个包含 2 个元素(0 和 1)的切片,而不是 3 个元素。

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

ranges documentationdesign champion issue 都只是声明上限是排他性的 - 没有给出任何解释(至少我找不到)。还有a discussion about this on GitHub,但似乎也没有任何官方解释。

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

【问题讨论】:

  • 如果任何关于 SO 的任何人都可以提供的官方文档,它很可能被正式记录在某个地方可以找到。所以我敢打赌,你也只会在这里猜到。我的是:因为它被解释为“从元素(开始)开始,给我一个数组(结束开始)的大小” - 所以在这种情况下,是一个二元素数组。
  • 可能是因为它在使用从零开始的数组的范围时最有意义 - 0 是开始,array.Length 是结束。对于基于0 的数组,maxIndexLength - 1。这遵循同样的想法。另请注意,Random.Next(min, max) 具有类似的约束条件(min 包含,max 不包含)。
  • EWD831 (Dijkstra, 1982)
  • 因此您可以轻松地表示一个空范围等。从数学上讲,半开区间对于这种事情要好得多。

标签: c# c#-8.0


【解决方案1】:

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

注意:这只是一个随意的决定,他们选择独占的原因是因为他们选择了独占。由于利弊,这很容易不是这种情况。

C# Language Design Notes for Jan 22, 2018

...

结论

Let us go with .. 表示排他性。因为我们选择专注于 索引/切片场景,这似乎是正确的做法:

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

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

【讨论】:

  • ...这也是其他语言(Python...)作者决定实现它的方式
猜你喜欢
  • 2012-07-07
  • 2021-10-24
  • 2018-09-15
  • 2018-02-10
  • 2017-10-25
  • 2016-09-06
  • 2011-05-12
  • 1970-01-01
  • 2019-08-01
相关资源
最近更新 更多