first_expression と second_expression の型が同じであるか、一方の型から他方の型への暗黙的な変換が存在する必要があります。
リテラルに接尾辞がない場合、その値を表すことができるこれらの型の最初のものを持ちます: int、uint、long、ulong。
検討:
var value = test ? (Int64)1 : 0;
0、接尾辞のない 10 進数リテラルは に変換されますint
。 int
に暗黙的に変換できますInt64
。この変換は一方向でのみ行われるため、戻り値が Int64 になることは安心できます。
でも:
var value = test ? (UInt64)1 : 0;
UInt64
とint
を暗黙のうちに相互に変換することはできませんが、このコードはコンパイルおよび実行され、結果の型はUInt64
.
の種類はどの時点で0
決定されますか?
2 つの型が相互に暗黙的にキャスト可能である場合、2 つの型のどちらになりますか? (これは通常は起こらないと思いますが、ユーザーが生成したクラスはそのようなキャストを実装できます。)
以前の調査:
同様のタイトルの他の質問をいくつか見つけましたが、それらはすべて null または nullable 型に関連していました。
関連性: これは私のコードでは重要です。なぜなら、この結果をすぐに ByteWriter.Write に渡し、正しいバイト数を書き込む正しいオーバーロードで終わりたいからです。もちろん、例は大幅に単純化されています。
明示的なキャストなしで実際に何が起こっているかに関係なく、代替構文は結果を明示的にします。
var value = test ? (UInt64)1 : (UInt64)0;