公式回答
見やすくするために、C#8ブログ投稿からのこの設計決定を説明するMads Torgersenからのコメントを次に示します。
始点演算と終点演算については、Pythonに従うことを決定しました。 0
(いつものように)最初の要素と^0
「長さ」の要素、つまり最後から1つ目の要素を指定し ます。このようにすると、要素の最初からの位置と最後からの位置の合計が長さに等しい単純な関係が得られます。 x
中には、 ^x
あなたが数学を自分で行わたい場合、あなたは長さから差し引かであろうものです。
-
新しいハット(^
)演算子の代わりにマイナス()を使用しないのはなぜですか?これは主に範囲に関係しています。繰り返しになりますが、Pythonおよび業界のほとんどと同様に、範囲を最初は包括的に、最後は排他的にしたいと考えています。範囲は最後まで行くべきだと言うために渡すインデックスは何ですか?C#では、答えは簡単です 。最後x..^0
から x
最後までです。Pythonでは、指定できる明示的なインデックスはあり-0
ません0
。最初の要素と等しいため、機能しません。したがって、Pythonでは、最後まで続く範囲を表すために、終了インデックスを完全にオフにする必要がありますx..
。範囲の終わりが計算された場合、それがに出た場合に備えて、特別なロジックを持つことを忘れないでください0
。のようにx..-y
、どこy
計算され、に出てきました0
。これは一般的な迷惑であり、バグの原因です。
最後に、インデックスと範囲は.NET / C#の最初のクラスタイプであることに注意してください。それらの動作は、それらが適用されるもの、またはインデクサーで使用されるものとは関係ありません。Indexを使用する独自のインデクサーと、それを使用する別のインデクサーを完全に定義できます。Range
このようなインデクサーをegなどに追加します Span
。しかし、たとえば、範囲を取るメソッドを持つこともできます。
私の答え
これは、私たちが慣れている古典的な構文と一致するためだと思います。
value[^1] == value[value.Length - 1]
0を使用する場合、2つの構文を並べて使用すると混乱を招きます。この方法では、認知負荷が低くなります。
Pythonなどの他の言語でも同じ規則が使用されます。
[beginInclusive, endExclusive)
。これは一般的な慣習です。