6

これが許可されていない理由はわかっています。

ulong x = 0xFEDCBA9876543210;
long y = Int64.MaxValue;
Console.WriteLine(x < y);

明らかに、ランタイムがいずれかのオペランドを他の型またはより大きな型に暗黙的にキャストして比較を機能させる方法はありません。

演算子「<」は、タイプ「ulong」および「long」のオペランドには適用できません。

したがって、これも許可されません ( とMinValueを使用const):

ulong x = 0xFEDCBA9876543210;
const long y = Int64.MinValue;
Console.WriteLine(x < y);

ただし、これは許可されています (MaxValue代わりに):

ulong x = 0xFEDCBA9876543210;
const long y = Int64.MaxValue;
Console.WriteLine(x < y);

andを<受け入れることの過負荷はありませんが、Reflector で、これが暗黙のうちに に変換されることがわかりました。しかし、これは常に起こるわけではありません。それはどのように機能し、この不一致の理由は何ですか?ulonglongInt64.MaxValueulong

4

2 に答える 2

3

long y = Int64.MaxValue; if (x < y)...との大きな違いの1つif (x < Int64.MaxValue)は、後者の場合、コンパイラは必要に応じて実際に定数値を確認できることです。実際の定数値がulong範囲に収まるため、暗黙的なキャストは問題ないことがわかります。

プレーン変数long yの場合、コンパイラーはyの実行時の値が何であるかについて何も仮定できません。代入ステートメントは1つ上のステートメントであることを忘れないでください。コンパイラは、変数に割り当てられた値を追跡しません。

DarkGrayが指摘しているように、const varは、値が変更されないことをコンパイラーに指示したため、定数として動作します。

于 2012-07-27T00:10:50.047 に答える
1

ulong 範囲の値を持つ const long は、サイレントに const ulong に変換されます。

これは許可されています:

ulong x = 0xFEDCBA9876543210; 
const long y = Int64.MaxValue; 
Console.WriteLine(x < y); 

const ulong z = y;
于 2012-07-27T00:06:23.040 に答える