チェックされたコンテキストにある場合にのみ、その例外をスローします。http://msdn.microsoft.com/en-us/library/y3d0kef1(v=vs.80).aspxを参照してください。
例外なし:
uint u1 = uint.MaxValue - 1000;
byte[] b = BitConverter.GetBytes(u1);
uint u2 = BitConverter.ToUInt32(b, 0);
uint u3 = (uint) (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24));
例外:
checked
{
uint u1 = uint.MaxValue - 1000;
byte[] b = BitConverter.GetBytes(u1);
uint u2 = BitConverter.ToUInt32(b, 0);
uint u3 = (uint) (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24));
}
例外なし
checked
{
unchecked
{
uint u1 = uint.MaxValue - 1000;
byte[] b = BitConverter.GetBytes(u1);
uint u2 = BitConverter.ToUInt32(b, 0);
uint u3 = (uint) (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24));
Console.WriteLine(u1 + " " + u2 + " " + u3);
}
}
/checkedオプションを使用してコンパイルしていないことを確認してください。
例外は、intからuintにキャストすることによってスローされます。バイト(uint u3 = ...の行)でシフト演算子を使用すると、暗黙的にそれらをintにキャストします。MSBがオン( "1")のuintは、uintの範囲外の負のintです。オーバーフロー例外を誘発する可能性のある明示的なキャストがないため、intを使用してもそのような例外は発生しません。