值类型的显示/隐式转换和算术溢出检查
(显示/隐式)转换
编译器能够在基元类型之间进行隐式或显示转换
如果转换存在潜在的"安全"(转换会引起丢失精度或数量级),C#要求进行显示转换,如
Checked 与 Unchecked 基元类型操作
* System.Decimal是一个特殊的类型, Checked 和 Unchecked对他不起作用
编译器能够在基元类型之间进行隐式或显示转换
Int32 i = 5;
Int64 l = i; // 从Int32到Int64的隐式转换
如果两个类型之间的转换是"安全"的(安全是指转换不会造成数据丢失),那么C#允许在他们之间进行隐式转换Int64 l = i; // 从Int32到Int64的隐式转换
如果转换存在潜在的"安全"(转换会引起丢失精度或数量级),C#要求进行显示转换,如
Single s = 5.55;
Int32 i1 = (Int32) s; // 从Single到Int32的显式转换
Int32 i1 = (Int32) s; // 从Single到Int32的显式转换
Checked 与 Unchecked 基元类型操作
Byte b = 100;
b = (Byte) (b + 200); //运算溢出,结果为44
默认情况下CLR不检查溢出,可以通过增加/checked+编译器命令开关或checked{}语句打开溢出检查,当检查到有溢出时会抛出b = (Byte) (b + 200); //运算溢出,结果为44
OverflowException
b = checked((Byte) (b + 200)); //抛出 OverflowException
下面代码具有同样功能:b = checked((Byte) (b + 200)); //抛出 OverflowException
checked {
Byte b = 100;
b += 200;
}
Byte b = 100;
b += 200;
}
* System.Decimal是一个特殊的类型, Checked 和 Unchecked对他不起作用