隐式转换:从类型A到类型B的转换可以在所有的情况下进行,执行转换的规则非常简单,可以让编译器进行
显示转换:从类型A到类型B的转换只能在某些情况下进行,转换的规则比较赋值,应进行某种类型的处理
隐式转换的规则:任何类型A,只要其取值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B
在明确要求编译器把数值从一种数据类型转换为另外一种数据类型时,就是在执行显示转换
显示转换语法结构:destinationtype(sourcevar)即目标变量的类型(源变量的值)
就是把sourcevar中的值转换为destinationtype类型
注意:显示转换也只是在某些情况下可行的,彼此之间没有什么关系的类型不能进行数据类型转换
显示转换是将取值范围大的类型转换成取值范围小的类型,所以显示转换就会发生数据丢失,即溢出
我们可以使用checked和unchecked关键字来检查溢出。它们称为表达式的溢出检查环境
checked 关键字用于对整型算术运算和转换显式启用溢出检查。
默认情况下,如果表达式产生的值超出了目标类型的范围,则常数表达式将导致编译时错误,而非常数表达式在运行时计算并将引发异常。不过,如果通过编译器选项或环境配置在全局范围内取消了溢出检查,则可以使用 checked 关键字来启用此项功能。
例:
此示例演示如何对非常数表达式使用 checked。在运行时会报告溢出。
using System;
class OverFlowTest
{
static short x = 32767; // Max short value
static short y = 32767;
// Using a checked expression
static int CheckedMethod()
{
int z = 0;
try
{
z = checked((short)(x + y));
}
catch (System.OverflowException e)
{
Console.WriteLine(e.ToString());
}
return z;
}
static void Main()
{
Console.WriteLine("Checked output value is: {0}",
CheckedMethod());
}
}
示例输出:
System.OverflowException: 算术运算导致溢出。
在 OverFlowTest.CheckedMethod() 位置 D:"My Documents"Visual Studio 2005"Proje
cts"ConsoleApplication1"ConsoleApplication1"Program.cs:行号 14
Checked output value is: 0
unchecked 关键字用于取消整型算术运算和转换的溢出检查。
在未检查的上下文中,如果表达式产生目标类型范围之外的值,则结果被截断。
例:
unchecked
{
int val = 2147483647 * 2;
}
int的取值范围:在-2147483648~2147483647之间的整数
因为上面的计算在 unchecked 块中执行,所以结果对于整数来说太大这一事实被忽略,并且 val 被赋予值 -2。默认情况下,启用溢出检测,
这与使用 checked 具有相同的效果。
在上面的示例中,如果省略 unchecked,将产生编译错误,因为表达式使用常数,结果在编译时是已知的。unchecked 关键字还取消对非常数
表达式的溢出检测,这是为了避免在运行时导致 OverflowException。
unchecked 关键字还可以用作运算符,如下所示:
public int UncheckedAdd(int a, int b)
{
return unchecked(a + b);
}
例:
此示例通过在常数表达式中使用 unchecked,显示如何使用 unchecked 语句。
using System;
class TestClass
{
const int x = 2147483647; // Max int
const int y = 2;
static void Main()
{
int z;
unchecked
{
z = x * y;
}
Console.WriteLine("Unchecked output value: {0}", z);
}
}
示例输出:
Unchecked output value: -2