(C#で)checked(...)
オーバーフローチェックのために式に動的な「スコープ」を持たせることは可能ですか? つまり、次の例では:
int add(int a, int b)
{
return a + b;
}
void test()
{
int max = int.MaxValue;
int with_call = checked(add(max, 1)); // does NOT cause OverflowException
int without_call = checked(max + 1); // DOES cause OverflowException
}
式checked(add(max, 1))
では、関数呼び出しによってオーバーフローが発生するため、式の動的範囲内でOverflowException
オーバーフローが発生しても no がスローされます。checked(...)
両方の方法を評価int.MaxValue + 1
して をスローさせる方法はありOverflowException
ますか?
編集:まあ、方法があるかどうか教えてください。または、これを行うためのより良い方法を教えてください(お願いします)。
これが必要だと思う理由は、次のようなコードがあるからです。
void do_op(int a, int b, Action<int, int> forSmallInts, Action<long, long> forBigInts)
{
try
{
checked(forSmallInts(a, b));
}
catch (OverflowException)
{
forBigInts((long)a, (long)b);
}
}
...
do_op(n1, n2,
(int a, int b) => Console.WriteLine("int: " + (a + b)),
(long a, long b) => Console.WriteLine("long: " + (a + b)));
が範囲内にある場合、および小さい整数の加算がオーバーフローしたint: ...
場合a + b
は、これを出力します。単純にすべてを変更するよりも優れたこれを行う方法はありますか (私はたくさん持っています)?int
long: ...
Action