是否有可能(在 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
(我有很多)更好的方法?