定义显式(隐式)运算符,通常是为了让开发人员进行自定义类型转换,提供开发的方便性和效率性。
基本格式如下:
public static implicit operator XXX(参数)-- 隐式重载运算符
public static explicit operator XXX(参数)-- 显式重载运算符
显式(隐式)的区别通俗的说就是在进行类型转换的时候,前段是否需要写明:(转换类型)
隐式可能造成代码不易于初级水平阅读
这个引用微软的经典例子方便理解:
Digit dig = new Digit(7);
//This call invokes the implicit "double" operator
double num = dig;
//This call invokes the implicit "Digit" operator
Digit dig2 = 12;
Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);
class Digit
{
public Digit(double d) { val = d; }
public double val;
// ...other members
// User-defined conversion from Digit to double
public static implicit operator double(Digit d)
{
return d.val;
}
// User-defined conversion from double to Digit
public static implicit operator Digit(double d)
{
return new Digit(d);
}
}
注意事项:
区分(类型) 和as 的使用场合
as曾经一直认为是来自于vb的历史遗留,不管对错,在如今的C#中依旧有很多的使用。
1 如果需要转换的两种类型本身无关,在进行自定义类型转换的过程中没有使用object传递参数,或者两者没有父子关系,可以使用(类型),as不正确;
2 两种转换类型如果通过object传参,则会忽略掉自己写的重载运算符,编译器会自己生成代码来进行检测,这个时候需要使用as才可以编译通过。可以设置断点来判断上述情况是否准确;
3 两种转换类型如果存在父子关系即基类子类关系,使用as,如果是子类跟子类则使用转换操作符;
很多资料会把1 3这样写:如果两个类都上溯到了某一个共同的基类,那么根据此基类的转型应该使用as,如果子类跟子类则使用转换操作符,这样说更加方便理解;