在C#中,我们使用implicit关键字来告诉编译器,在源代码中不必做显式的转型就可以产生调用转换操作符方法的代码;而使用explicit关键字来告诉编译器只有当源代码中指定了显式的转型时,才产生调用转换操作符方法的代码.
在implicit或者explicit关键字后面,我们需要指定operator关键字来告诉编译器该方法是一个转换操作符.在operator关键字后面,我们还需要指定对象转型时的目标类型;而在括号内,则需要指定对象转型时的源类型.
前面为Rational类型定义的转换操作符允许我们在C#中象下面这样来编写代码:
class App{
static void Main() {
Rational r1=5; //将Int32隐式转型为Rational
Rational r2=2.5F; //Single隐式转型为Rational
Int32 x=(Int32)r1; //将Rational显式转型为Int32
Single s=(Single) r1; //将Rational显式转型为Single
}
}
当C#编译器编译上面的代码时,它会检测到代码中的转型操作,并在内部产生调用Rational类型定义转换操作符方法的IL代码.这些方法的名称是什么呢?编译Rational类型并查看它的元数据,我们会看到编译器为每一个定义的转换操作符都产生了一个方法。对于Rational类型来讲,其4个转换操作符方法看起来就象下面的样子:
public static Rational op_Implicit(Int32 numerator)
public static Rational op_Implicit(Single value)
public static Int32 op_Explicit(Rational r)
public static Single op_Explicit(Rational r)