c#narrowing转换不会产生异常

Bru*_*tos 1 c# casting overflow

从C#类型转换表(http://msdn.microsoft.com/en-us/library/08h86h00.aspx):"缩小转换也可能导致其他数据类型的信息丢失.但是,OverflowException是如果正在转换的类型的值超出目标类型的MaxValue和MinValue字段指定的范围,则抛出,并且运行时检查转换以确保目标类型的值不超过其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();
}
Run Code Online (Sandbox Code Playgroud)

但相反,numb2的值为17237.我不知道这个值来自何处,我真的不明白为什么没有生成溢出异常.

任何建议都非常感谢!谢谢.

Lee*_*Lee 5

默认情况下不会检查数字转换.您可以使用checked块强制执行此操作:

checked { short s = (short)numb1; }
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用Convert检查转换的类:

short s = Convert.ToInt16(numb1);
Run Code Online (Sandbox Code Playgroud)

还有一个经过检查的编译器选项

值17237只是333333333的低16位(即333333333被截断以适应短路):

int s = numb1 & 0x0000FFFF;
Run Code Online (Sandbox Code Playgroud)