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

标签 c# c#-8.0

C#8在C#中添加了range语法:

var slice = myArray[0..2];
我发现不是那么直观的是,上限(在上一个示例中为2)是 Exclusive -不是 inclusive ;即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#的行为与其他语言一致。但是我仍然想知道是否有关于此决定的任何官方文件。

最佳答案

很多设计决策都无法获得令人满意的答案。但是,至少您可以通过以下链接在设计说明中(至少一个或多个提及)遵循此原则。
注意:这只是一个任意决定,他们选择独占的原因是因为他们选择了独占。由于优缺点,不可能很容易做到这一点。
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)遵循此约定,而其他语言则不遵循。

关于C#:为什么范围的上限是互斥的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64096539/

相关文章:

c# - 告诉编译器通用类型存在隐式转换

c# - C# 8.0 中是否有针对非空的 "check and get"运算符?

c# - NullableContextOptions 和 NullableReferenceTypes 之间有什么区别?

c# - C# 丢弃有任何性能优势吗?

c# - 使用 C#8.0 在 Visual Studio 中优化 switch case 后出现意外结果

C# 在不传递引用的情况下访问包含类的方法

c# - Fusion Log Assembly Binder 错误 - 绑定(bind)结果 : hr = 0x1. 函数不正确

c# - 如何在 OneSignal 中获取用户的标签?

c# - 根据企业 ID 更改登录时的连接字符串

C# 8 默认实现和依赖倒置