Respuesta oficial
Para una mejor visibilidad, aquí hay un comentario de Mads Torgersen que explica esta decisión de diseño de la publicación del blog C # 8 :
Decidimos seguir Python cuando se trata de la aritmética desde el principio y desde el final. 0
designa el primer elemento (como siempre) y ^0
el elemento "longitud", es decir, el que está justo al final. De esa manera, obtienes una relación simple, donde la posición de un elemento desde el principio más su posición desde el final es igual a la longitud. el x
en ^x
es lo que se ha restado de la longitud si había hecho sus propios cálculos.
¿Por qué no utilizar el operador menos ( -
) en lugar del nuevo ^
operador hat ( )? Esto tiene que ver principalmente con los rangos. Nuevamente, de acuerdo con Python y la mayoría de la industria, queremos que nuestras gamas sean inclusivas al principio, exclusivas al final. ¿Cuál es el índice que pasa para decir que un rango debe llegar hasta el final? En C # la respuesta es simple:x..^0
va desde x
el final. En Python, no hay un índice explícito que pueda dar: ¡ -0
no funciona, porque es igual al 0
primer elemento! Así que en Python, usted tiene que dejar el índice final por completo para expresar una gama que va hasta el final: x..
. Si se calcula el final del rango, debe recordar tener una lógica especial en caso de que salga 0
. Como en x..-y
dondey
se calculó y salió a 0
. Esta es una molestia común y fuente de errores.
Finalmente, tenga en cuenta que los índices y rangos son tipos de primera clase en .NET / C #. Su comportamiento no está vinculado a lo que se les aplica, o incluso para ser utilizado en un indexador. Puede definir totalmente su propio indexador que toma Index y otro que toma Range
, y vamos a agregar dichos indexadores, por ejemplo Span
. Pero también puede tener métodos que toman rangos, por ejemplo.
Mi respuesta
Creo que esto es para que coincida con la sintaxis clásica a la que estamos acostumbrados:
value[^1] == value[value.Length - 1]
Si usara 0, sería confuso cuando las dos sintaxis se usaran una al lado de la otra. De esta manera tiene menor carga cognitiva.
Otros lenguajes como Python también usan la misma convención.
[beginInclusive, endExclusive)
. Es una convención común.