Офіційна відповідь
Для кращої наочності, ось коментар Мадса Торгерсена, який пояснює це дизайнерське рішення з блогу 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 #. Їх поведінка не пов'язана з тим, до чого вони застосовуються, або навіть використовуються в індексаторі. Ви можете повністю визначити свій власний індексатор, який приймає індекс, і інший, який бере Range
- і ми збираємося додати такі індексатори, наприклад Span
. Але ви також можете мати методи, наприклад, діапазони.
Моя відповідь
Я думаю, що це відповідає класичному синтаксису, до якого ми звикли:
value[^1] == value[value.Length - 1]
Якщо він використовував 0, це було б заплутано, коли два синтаксиси використовувались поруч. Таким чином він має меншу пізнавальну навантаження.
Інші мови, такі як Python, також використовують цю ж умову.
[beginInclusive, endExclusive)
. Це загальна конвенція.