Resposta oficial
Para uma melhor visibilidade, aqui está um comentário de Mads Torgersen explicando essa decisão de design na postagem do blog C # 8 :
Decidimos seguir o Python quando se trata da aritmética do começo e do fim. 0 designa o primeiro elemento (como sempre) e ^0 o elemento “length'th”, ou seja, aquele logo no final. Dessa forma, você obtém um relacionamento simples, em que a posição de um elemento desde o início mais a posição do final é igual ao comprimento. o x in ^x é o que você teria subtraído do comprimento se tivesse feito as contas sozinho.
Por que não usar o operador menos ( -) em vez do ^operador new hat ( )? Isso tem a ver principalmente com intervalos. Novamente, de acordo com o Python e a maior parte do setor, queremos que nossos intervalos sejam inclusivos no início, exclusivos no final. Qual é o índice que você passa para dizer que um intervalo deve percorrer todo o caminho até o fim? Em C #, a resposta é simples: x..^0vai do x final. No Python, não há um índice explícito que você possa fornecer: -0não funciona, porque é igual ao 0primeiro elemento! Assim, em Python, você tem que deixar o índice final off completamente para expressar um intervalo que vai para o fim: x... Se o final do intervalo for calculado, você precisará se lembrar de ter uma lógica especial caso isso ocorra 0. Como em x..-yondeyfoi computado e saiu para 0. Este é um incômodo comum e fonte de bugs.
Por fim, observe que índices e intervalos são tipos de primeira classe no .NET / C #. O comportamento deles não está vinculado ao que eles são aplicados ou mesmo para serem usados em um indexador. Você pode definir totalmente seu próprio indexador que usa Index e outro que usa Range- e vamos adicionar esses indexadores a, por exemplo Span. Mas você também pode ter métodos que levam intervalos, por exemplo.
Minha resposta
Acho que isso corresponde à sintaxe clássica à qual estamos acostumados:
value[^1] == value[value.Length - 1]
Se usasse 0, seria confuso quando as duas sintaxes fossem usadas lado a lado. Dessa forma, possui menor carga cognitiva.
Outras linguagens como Python também usam a mesma convenção.
[beginInclusive, endExclusive). É uma convenção comum.