1

C#型変換テーブル(http://msdn.microsoft.com/en-us/library/08h86h00.aspx)から:「変換を絞り込むと、他のデータ型の情報が失われる可能性もあります。ただし、OverflowExceptionは変換される型の値がターゲット型のMaxValueおよびMinValueフィールドで指定された範囲外にある場合にスローされ、変換はランタイムによってチェックされ、ターゲット型の値がMaxValueまたはMinValueを超えないことが確認されます。 。」

したがって、次のコードで例外が生成されることを期待していました。

static void Main() {
    int numb1 = 333333333;
    short numb2 = (short)numb1;

    Console.WriteLine("Value of numb1 is {0}", numb1);
    Console.WriteLine("Type of numb1 is {0}", numb1.GetType());
    Console.WriteLine("MinValue of int is {0}", int.MinValue);
    Console.WriteLine("MaxValue of int is {0}\n", int.MaxValue);

    Console.WriteLine("Value of numb2 is {0}", numb2);
    Console.WriteLine("Type of numb2 is {0}", numb2.GetType());
    Console.WriteLine("MinValue of short is {0}", short.MinValue);
    Console.WriteLine("MaxValue of short is {0}", short.MaxValue);

    Console.ReadKey();
}

しかし、代わりにnumb2は17237の値を取得します。この値がどこから来ているのかわかりません。また、オーバーフロー例外が生成されなかった理由を本当に理解していません。

どんな提案でも大歓迎です!ありがとう。

4

2 に答える 2

5

デフォルトでは、数値変換はチェックされません。checkedブロックを使用してこれを強制できます。

checked { short s = (short)numb1; }

Convertまたは、変換をチェックするクラスを使用できます。

short s = Convert.ToInt16(numb1);

チェックされたコンパイラオプションもあります

値17237は、333333333の下位16ビットです(つまり、333333333は短縮形に切り捨てられます)。

int s = numb1 & 0x0000FFFF;
于 2012-09-15T22:41:27.890 に答える
2

ナローイング変換は通常、実行時にC#を使用して実行される変換です。キャストとは、explicit変換先がわかっていて、例外やコンパイルエラーが発生しないことをコンパイラーに通知する演算子を使用することです。例外を介して実行されるConvert.ToUInt16(int)ナローイング変換は、通常、--などの変換メソッドによって呼び出される変換です。これは、より大きな値が渡された場合スローされます。OverflowExceptionint65535

于 2012-09-15T22:38:42.260 に答える