我的意思是,我可以构建一般程序
public bool Overflows<T> ( T a, T b )
{
// returns true or false based on whether
// a + b overflows
}
我可以像
一样使用byte b1 = 255,
b2 = 1;
Console.WriteLine("Does {0} + {1} oveflow? {2}", b1, b2, Overflows(b1,b2) ? "Yes : "No"); // Answer should be "Yes" here
???
我想在byte
s的情况下,我可以查看(a+b) < a
和(a+b) < b
。例如我知道255+1
溢出,因为0
小于255
和1
时的结果。或者,我可以将它们转换为更大的数据类型并检查
return ((int)a + (int)b) > (int)Byte.MaxValue;
但这不适用于所有拥有+
运营商的数字类型。
答案 0 :(得分:4)
最简单的方法是显式检查溢出并捕获相关的异常(伪代码 - 见下文):
public bool Overflows<T> ( T a, T b )
{
{
// the 'checked' keyword ensures an OverflowException is thrown
// as a result of a real integer overflow happening
c = checked(a + b); // * with 'T' this won't compile, see below
return false;
}
catch (System.OverflowException e)
{
return true;
}
}
但是,对于泛型类型参数T
,编译器不了解+
运算符。这里有两个选择:
Overflows(int, int)
,Overflows(byte, byte)
等。使用类型比较和强制转换:
if (typeof(T) == typeof(int))
int i = checked((int)a + (int)b);
else if (typeof(T) == typeof(byte))
byte b = checked((byte)a + (byte)b);
… etc.