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..^0idzie od x końca. W Pythonie nie ma wyraźnego indeksu, który możesz podać: -0nie działa, ponieważ jest równy 0pierwszemu 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, gdzieyzostał 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.