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..^0
vai do x
final. No Python, não há um índice explícito que você possa fornecer: -0
não funciona, porque é igual ao 0
primeiro 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..-y
ondey
foi 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.