Oficjalna odpowiedź
Aby uzyskać lepszą widoczność, oto komentarz Madsa Torgersena wyjaśniający tę decyzję projektową z wpisu na blogu C # 8 :
Zdecydowaliśmy się pójść za Pythonem, jeśli chodzi o arytmetykę od początku i od końca. 0
wyznacza pierwszy element (jak zawsze) i ^0
„długość” elementu, czyli ten znajdujący się tuż za końcem. W ten sposób otrzymujesz prostą relację, w której pozycja elementu od początku plus jego pozycja od końca równa się długości. x
w ^x
to co byś odjąć od długości jeśli zrobił matematyki siebie.
Dlaczego nie użyć minus ( -
) zamiast nowego ^
operatora hat ( )? Dotyczy to przede wszystkim zakresów. Ponownie, zgodnie z Pythonem i większością branży, chcemy, aby nasze zakresy były na początku uwzględniające, a na końcu wyłączne. Jaki jest indeks, który przekazujesz, aby stwierdzić, że zakres powinien sięgać aż do końca? W C # odpowiedź jest prosta: x..^0
idzie od x
końca. W Pythonie nie ma wyraźnego indeksu, który możesz podać: -0
nie działa, ponieważ jest równy 0
pierwszemu elementowi! Tak w Pythonie, musisz opuścić indeks końcowy całkowicie wyłączony w celu wyrażenia zakresu że idzie do końca: x..
. Jeśli obliczany jest koniec zakresu, musisz pamiętać o specjalnej logice na wypadek, gdyby to się okazało 0
. Jak w x..-y
, gdziey
został obliczony i wyszedł do 0
. Jest to powszechna uciążliwość i źródło błędów.
Na koniec zwróć uwagę, że indeksy i zakresy są pierwszymi typami klas w .NET / C #. Ich zachowanie nie jest powiązane z tym, do czego są stosowane, ani nawet nie ma ich używać w indeksatorze. Możesz całkowicie zdefiniować swój własny indeksator, który pobiera indeks i inny, który bierze Range
- i zamierzamy dodać takie indeksatory np Span
. Ale możesz też mieć metody, które na przykład przyjmują zakresy.
Moja odpowiedź
Myślę, że jest to zgodne z klasyczną składnią, do której jesteśmy przyzwyczajeni:
value[^1] == value[value.Length - 1]
Gdyby używał 0, byłoby mylące, gdyby dwie składnie były używane obok siebie. W ten sposób ma mniejsze obciążenie poznawcze.
Inne języki, takie jak Python, również używają tej samej konwencji.
[beginInclusive, endExclusive)
. To powszechna konwencja.