4

?: 演算子 (C# リファレンス)

first_expression と second_expression の型が同じであるか、一方の型から他方の型への暗黙的な変換が存在する必要があります。

整数リテラル

リテラルに接尾辞がない場合、その値を表すことができるこれらの型の最初のものを持ちます: int、uint、long、ulong。

検討:

var value = test ? (Int64)1 : 0;

0、接尾辞のない 10 進数リテラルは に変換されますintintに暗黙的に変換できますInt64。この変換は一方向でのみ行われるため、戻り値が Int64 になることは安心できます。

でも:

var value = test ? (UInt64)1 : 0;

UInt64intを暗黙のうちに相互に変換することはできませんが、このコードはコンパイルおよび実行され、結果の型はUInt64.

の種類はどの時点で0決定されますか?

2 つの型が相互に暗黙的にキャスト可能である場合、2 つの型のどちらになりますか? (これは通常は起こらないと思いますが、ユーザーが生成したクラスはそのようなキャストを実装できます。)

以前の調査:
同様のタイトルの他の質問をいくつか見つけましたが、それらはすべて null または nullable 型に関連していました。

関連性: これは私のコードでは重要です。なぜなら、この結果をすぐに ByteWriter.Write に渡し、正しいバイト数を書き込む正しいオーバーロードで終わりたいからです。もちろん、例は大幅に単純化されています。

明示的なキャストなしで実際に何が起こっているかに関係なく、代替構文は結果を明示的にします。

var value = test ? (UInt64)1 : (UInt64)0;
4

2 に答える 2

3

数値がコンパイル時の定数(リテラル) である場合の整数型間の暗黙的な変換のセットと、定数ではない場合の別の変換のセットがあることに注意してください。

あなたの興味深い例は次のとおりです。

var value = test ? (UInt64)1 : 0;

これは次のようにも書けます:

var value = test ? 1ul : 0;

ここで、接尾辞ulは を意味します。ulongSystem.UInt64

intリテラル (定数) が使用される場合、 ( System.Int32) から への暗黙的な変換が存在しますが、その定数が負でulongない場合のみです。intそれは本当に次と同じです:

const ulong a = 1ul;
const int b = 0;
var value = test ? a : b;  // also works fine

int私が言ったように、 (コンパイラーbは が負でないことを知っているため) からへの暗黙の定数変換のために機能しulongます。

次に、 を取り除いて次のconstものを取得します。

ulong a = 1ul;
int b = 0;
var value = test ? a : b;  // compile-time error, no implicit conversion in either direction!

非定数では、どちらの方向にも暗黙の変換が存在しないことがわかります。そのためaband の最適な共通型はなく、これは失敗します。

于 2013-08-28T22:09:29.010 に答える
1

確かに、ジェネリック は暗黙的に任意の長さintに変換できません。UIntしかし、ここでは一般的な未知のことを話しているわけではありませんint。これは(コンパイル時でも、コンパイラー0が行っていると思われる)に変換できますUInt

intパラメーター (またはコンパイラーがデータフロー分析を通じて推測できない別の値)を使用して、何が起こるかを確認することをお勧めします。

于 2013-08-28T20:24:52.320 に答える