私はちょうどこれを見つけました:
ushort i = 4;
i = i + 4;
コンパイラエラーが発生します:
タイプ 'int' を 'ushort' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)
次のように修正する必要があります。
ushort i = 4;
i = (ushort)(i + 4);
この背後にある理由は何ですか? すべてのデータ型を使用するのは明白で簡単であるべきではありませんか?
リテラル4
は であり、int
に昇格した加算も同様です。この加算の結果もであるため、キャストなしで a に代入することはできません。これは、C# では絶対値が小さい数値型への暗黙的な変換が許可されていないためです。i + 4
int
i
int
int
ushort
その理由は、ushort + ushort が実際には int を返すためです。なぜそうなるのかについては、このスレッドを参照してください。
コンパイラが4
として扱うためinteger
です。上位データ型から下位データ型への変換には、明示的なキャストが必要です。
コメントから取り除かなければならない主なことは、int32が当時の一般的なアーキテクチャで使用される「デフォルト」タイプにすぎなかったということです。現在のプロセッサによるより小さい整数型のネイティブ サポートについては知りませんが、たとえそれが ushort であっても、水中でコンパイラによってすべてが int32 に変換されても驚かないでしょう。
したがって、(u)short は、プログラマーにとってメモリセーバーというよりも検証制約のようなものです。たとえそれがメモリセーバーであっても、変換して ushort に戻すためにさらに多くの CPU サイクルが必要になるとしても、私は驚かないでしょう。
C# 言語標準、具体的には整数リテラルに関する §2.4.4.2 に従って:
整数リテラルの型は次のように決定されます。
リテラルに接尾辞がない場合、その値を表すことができるこれらの型の最初のものを持ちます: int、uint、long、ulong。リテラルに U または u の接尾辞が付いている場合、その値を表すことができる最初の型 (uint、ulong) を持ちます。リテラルに L または l という接尾辞が付いている場合、その値を表すことができる最初の型 (long、ulong) があります。リテラルの末尾に UL、Ul、uL、ul、LU、Lu、lU、または lu が付いている場合、そのリテラルは ulong 型です。
したがって、あなたの番号は int のように扱われています。それが理由です。
整数型の-operatior は、、 、、および+
のペアの間でのみ定義されます。最初に計算するには、暗黙的な数値変換によってから に変換する必要があり、結果は同じ型になります。つまり、 の型は実際にはです。コンパイラとして定義された変数に を割り当てることを許可する暗黙的な変換がないため、 に対してエラーが発生します。int
uint
long
ulong
i+4
i
ushort
int
int
i+4
int
int
ushort
i = i + 4
+=
暗黙のキャストが含まれているため、以下を引き続き使用できることに注意してください。
i += 4;