用户自定义强制转换
本文关于用户自定义的类型的强制转换,我觉得也是挺有趣的买剧场可能生活工作中用到的次数不是很多
自定义强制转换
强制转换分为两种,一种是显式转换(explicit),一种是隐式转换(implicit)。
其实两种都差不多,区别就是前者你需要有一个(xxx)这样的方式。
一般来说,转换的时候没有溢出风险之类的,你可以直接使用隐式的,有那种需要提醒程序员警惕的,弄一个强制转换。
语法
- 除了相对应的关键词 explicit/implicit外,还需要operator关键词
- 需要使用public和static关键词
class{
int i{get;set;}
float f{get;set;}
//隐式转换
public static implicit operator float (Currency value)
{
return vlaue.f;
}
//显式转换
public static explicit operator int (Currency value)
{
return value.i;
}
}
注意
- 派生关系不能够自定义强制转换,系统早就实现过了
- 转换的代码必须写在类的内部,同时,一边定义过了,另一边不可以定义,要不然编译器会头疼用哪个方案的
- 对于A-B的转换,显式和隐式不能共存,只能写一种
- 派生可以转成基类,反着不行
- 装箱拆箱,你自定义的结构体可以变成引用,其实是系统在你写结构体的时候偷偷给你写了一个类,用的时候直接黑泥数据一对一复制过去了而已
- 【重点】自定义实现类->int,那么,类->long是不会报错的,系统会分两步走,先->int->long
- 类似于writeline(),有好多种重构的,你直接放一个类进去,因为你存在隐式转换成int,float之类的方法,他会先试试看这些,再使用这些(int,float)的方法的toString()。所以建议以后要写x.toString比较保险