本文关于用户自定义的类型的强制转换,我觉得也是挺有趣的买剧场可能生活工作中用到的次数不是很多

自定义强制转换

强制转换分为两种,一种是显式转换(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;     
    }
}

注意

  1. 派生关系不能够自定义强制转换,系统早就实现过了
  2. 转换的代码必须写在类的内部,同时,一边定义过了,另一边不可以定义,要不然编译器会头疼用哪个方案的
  3. 对于A-B的转换,显式和隐式不能共存,只能写一种
  4. 派生可以转成基类,反着不行
  5. 装箱拆箱,你自定义的结构体可以变成引用,其实是系统在你写结构体的时候偷偷给你写了一个类,用的时候直接黑泥数据一对一复制过去了而已
  6. 【重点】自定义实现类->int,那么,类->long是不会报错的,系统会分两步走,先->int->long
  7. 类似于writeline(),有好多种重构的,你直接放一个类进去,因为你存在隐式转换成int,float之类的方法,他会先试试看这些,再使用这些(int,float)的方法的toString()。所以建议以后要写x.toString比较保险