10

以下では:

public class p
{
  short? mID;
  short? dID;
}

short id = p.mID ?? -p.dID.Value;

コンパイラは私にエラーを与えます:

エラー 21 タイプ 'int' を 'short' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

コードを機能させるには、コードを次のように変更する必要があります。

short id = p.mID ?? (short)-p.dID.Value;

コンパイラが (int)0 - p.dID.Value、またはその Int16.operator - Int32s を返すようなことを行っているかのようです...?

4

2 に答える 2

14

仕様のセクション 7.6.2 を参照してください。


–x 形式の操作の場合、単項演算子のオーバーロードの解決が適用され、特定の演算子の実装が選択されます。オペランドは選択した演算子のパラメーターの型に変換され、結果の型は演算子の戻り値の型になります。定義済みの否定演算子は次のとおりです。

整数の否定:

int operator –(int x);
long operator –(long x);

結果は、ゼロから x を引いて計算されます。x の値がオペランド型の表現可能な最小値 (int の場合は -2^31、long の場合は -2^63) である場合、 x の数学的な否定はオペランド型内では表現できません。これがチェックされたコンテキスト内で発生した場合、System.OverflowException がスローされます。チェックされていないコンテキスト内で発生した場合、結果はオペランドの値になり、オーバーフローは報告されません。否定演算子のオペランドが uint 型の場合、long 型に変換され、結果の型は long になります。例外は、int 値 -2147483648 (-2^31) を 10 進整数リテラルとして書き込むことを許可する規則です。

否定演算子のオペランドが ulong 型の場合、コンパイル エラーが発生します。例外は、long 値 -9223372036854775808 (-2^63) を 10 進整数リテラルとして書き込むことを許可する規則です。

浮動小数点の否定:

float operator –(float x);
double operator –(double x);

結果は、符号が反転された x の値です。x が NaN の場合、結果も NaN になります。

10 進数の否定:

decimal operator –(decimal x);

結果は、ゼロから x を引いて計算されます。10 進数の否定は、System.Decimal 型の単項マイナス演算子を使用することと同じです。


ご覧のとおり、short には単項マイナス演算子が定義されていません。オーバーロードの解決は、使用可能なすべての単項マイナス演算子の中で最も一致するものであるため、int のものを選択します。

于 2010-01-13T16:16:37.870 に答える
2

短い値を取る単項マイナス演算子はありません。代わりに、オーバーロードの解決では、単項マイナス演算子の int バージョンが選択され、暗黙的な変換が行われます。

于 2010-01-13T16:17:32.657 に答える