1

来自 C# 类型转换表 (http://msdn.microsoft.com/en-us/library/08h86h00.aspx):“缩小转换也可能导致其他数据类型的信息丢失。但是,溢出异常是如果正在转换的类型的值超出目标类型的 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();
}

但是 numb2 得到的值是 17237。我不知道这个值是从哪里来的,我真的不明白为什么没有生成溢出异常。

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

4

2 回答 2

5

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

checked { short s = (short)numb1; }

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

short s = Convert.ToInt16(numb1);

还有一个选中的编译器选项

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

int s = numb1 & 0x0000FFFF;
于 2012-09-15T22:41:27.890 回答
2

缩小转换通常是使用 C# 在运行时完成的转换。强制转换是使用explicit运算符告诉编译器您知道要转换为什么并且不希望出现任何异常或编译错误。Convert.ToUInt16(int)通过异常进行的窄化转换通常是由转换方法调用的那些,例如 --这会抛出OverflowExceptionif 传递的int大于65535

于 2012-09-15T22:38:42.260 回答