Официальный ответ
Для лучшей наглядности вот комментарий от Мэдс Торгерсен, объясняющий это дизайнерское решение из блога C # 8 :
Мы решили следовать Python, когда дело доходит до арифметики начала и конца. 0 обозначает первый элемент (как всегда) и ^0 «длина», т. е. один с самого конца. Таким образом, вы получите простое отношение, где позиция элемента от начала плюс его позиция от конца равна длине. x в ^x то , что вы бы вычесть из длины , если бы вы сделали вычислить число самостоятельно.
Почему бы не использовать минус ( -) вместо нового ^оператора hat ( )? Это в первую очередь связано с диапазонами. Опять же, в соответствии с Python и большей частью отрасли, мы хотим, чтобы наши диапазоны были включающими в начале, исключительными в конце. Какой индекс вы передаете, чтобы сказать, что диапазон должен идти до конца? В C # ответ прост: x..^0идет от x конца до конца. В Python нет явного индекса, который вы можете дать: -0не работает, потому что он равен 0первому элементу! Таким образом , в Python, вы должны оставить конечный индекс от полностью выразить диапазон , который идет до конца: x... Если вычисляется конец диапазона, то вам нужно помнить, чтобы иметь особую логику на случай, если он выйдет 0. Как x..-yи гдеyбыл вычислен и вышел 0. Это распространенная неприятность и источник ошибок.
Наконец, обратите внимание, что индексы и диапазоны являются первоклассными типами в .NET / C #. Их поведение не связано с тем, к чему они применяются, или даже для использования в индексаторе. Вы можете полностью определить свой собственный индексатор, который использует Index, и другой, который принимает Range- и мы собираемся добавить такие индексаторы, например Span. Но вы также можете иметь методы, которые принимают диапазоны, например.
Мой ответ
Я думаю, что это соответствует классическому синтаксису, к которому мы привыкли:
value[^1] == value[value.Length - 1]
Если бы он использовал 0, было бы непонятно, когда два синтаксиса использовались бок о бок. Таким образом, у него снижается когнитивная нагрузка.
Другие языки, такие как Python, также используют то же соглашение.
[beginInclusive, endExclusive). Это общее соглашение.