从C#类型转换表(http://msdn.microsoft.com/en-us/library/08h86h00.aspx):“缩小转换也可能导致其他数据类型的信息丢失。但是,如果正在转换的类型的值超出目标类型的MaxValue和MinValue字段指定的范围,则抛出OverflowException,并且运行时检查转换以确保目标类型的值不超过其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.我不知道这个值来自何处,我真的不明白为什么没有生成溢出异常。
任何建议都非常感谢!感谢。
答案 0 :(得分:5)
默认情况下不会检查数字转换。您可以使用checked
块强制执行此操作:
checked { short s = (short)numb1; }
或者,您可以使用检查转化次数的Convert
类:
short s = Convert.ToInt16(numb1);
值17237只是333333333的低16位(即333333333截断以适合短路):
int s = numb1 & 0x0000FFFF;
答案 1 :(得分:2)
缩小转换通常是在运行时使用C#完成的转换。转换是使用explicit
运算符,它告诉编译器您知道要转换的内容并且不希望任何异常或编译错误。通过异常执行的缩小转换通常是由Convert.ToUInt16(int)
等转换方法调用的那些 - 如果传递的OverflowException
大于{{},则将抛出int
1}}。