微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决C#:为什么范围的上限是互斥的?

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#的行为与其他语言一致。但是我仍然想知道有关此决定的任何官方文档。

解决方法

有很多设计决策只是没有令人满意的答案。但是,此代码至少具有一个 paper-trail ,您可以在以下链接中的设计说明中(有一个或多个提及)进行跟踪。

注意:这只是一个任意决定,他们选择独占的原因是因为他们选择了独占。鉴于其优缺点

C# Language Design Notes for Jan 22,2018

...

结论

让我们一起使用..意味着排他。由于我们选择专注于 索引/切片方案,这似乎是正确的事情:

  • 它允许a.Length作为端点,而无需添加/减去1。
  • 它使一个范围的结尾成为下一个不重叠的开头
  • 它避免了x..x-1形式的丑陋的空范围

正如@vc74在评论中提到并在提供的文档中也指出的那样,其他语言(例如 python )都遵循此约定,而其他语言则不

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。