4

条件演算子の 2 番目と 3 番目のオペランドとして、より狭い null 許容値とより広い数値を組み合わせると、C# で予期しない結果が得られます。これは機能しませんが、より広い数値が int 型の定数式であり、より狭い nullable が SByte 型である場合は機能しますか? またはInt16?デモ:

bool test = true;
Int16? aShort = 5;
Int32 anInt = 5;
const Int32 aConstInt = 4;
Object o1 = test ? aShort : anInt;      // does not compile
Object o2 = test ? aShort : aConstInt;  // does compile

私の質問は、私のintが定数の場合、なぜコンパイルされるのですか? そして、C# 言語仕様でこれへの参照を見つけることができません。ここで何が起こっているのでしょうか?

4

4 に答える 4

1

あなたが書くとき:

const Int32 aConstInt = 4;
Object o2 = test ? aShort : aConstInt;  // does compile

コンパイラはaConstInt、2 行目の参照を、あたかも単にそこに置いたかのように扱うことができます4。コンテキストに基づいて、をではなくに4変換します。コンパイラは、入力が ではない場合と同様に、入力が であることのみを認識している場合、異なる動作をします。shortInt32Int32const

宣言した場合:

const Int32 aConstInt = short.MaxValue + 1;

次に、コンパイラは同じ行のコンパイルを許可しません。

Object o2 = test ? aShort : aConstInt;  // does not compile

として扱われているため32768、 ではありませんshort

于 2013-04-07T21:39:56.740 に答える
0

C# コンパイラは、定数を特別に扱います。この特別なプロパティは、 のような式間でも伝播します1+2nullラムダも特別です。CLR 型はありませんが、任意の参照型または一致するデリゲート型に変換できます。(nullはオブジェクト型ではありません!)。

これは C# 仕様で義務付けられています。実装が定数式を解決し、その変換可能性プロパティを維持するように強制します。

例:

short x = 1; //assigning an integer literal to a short - works because it is a constant
short y = 1+2; //also works for expressions

キャストなしで int に long を割り当てることもできます。

const Int64 a = 1;
Int32 b = a;

定数は伝播するだけです。

于 2013-04-07T21:39:38.830 に答える