В С# 8.0 представлен удобный способ нарезки массивов - см. Официальный пост С# 8.0.
Синтаксис для доступа к последнему элементу массива
int value[] = { 10, 11, 12, 13 };
int a = value[^1]; // 13
int b = value[^2]; // 12
Мне интересно, почему индексирование для доступа к элементам в обратном направлении начинается с 1 вместо 0? Есть ли техническая причина для этого?