前言:
在C#中有两种类型的转换,分别是显式转换和隐式转换,本节讲述自定义类型转换。
示例:
float a = 123; //隐式转换 123为int类型,这里是直接把一个int值转为了float值,这一步是系统自动完成的
int b = (int)1.02f; //显示转换 浮点类型不能直接转为int类型,因此我们加上了(int)来指定float类型转为了int类型
//而我们是知道这一类型变化的,因此属于显示转换
explicit
先自定义两个类
class Temp_1
{
public int Value { get; }
public Temp_1(int value) => this.Value = value;
//类型转换必须要实现
public static explicit operator Temp_1(Temp_2 t2) => new Temp_1(t2.Value1 + t2.Value2);
}
class Temp_2
{
public int Value1 { get; }
public int Value2 { get; }
public Temp_2(int v1, int v2)
{
this.Value1 = v1;
this.Value2 = v2;
}
}
显式转换:
Temp_2 t2 = new Temp_2(123, 456);
Temp_1 t1 = (Temp_1)t2;
Console.WriteLine(t1.Value); ///会输出579
我们可以看到两个不同类型并没有继承关系确能进行转化,而:
public static explicit operator Temp_1(Temp_2 t2) => new Temp_1(t2.Value1 + t2.Value2);
可以看到 接收一个Temp_2类型的参数,返回一个Temp_1类型的对象。前面则为固定写法。
这行代码无论放在Temp_1还是Temp_2中都是一样的效果。但是到这里我们只能完成Temp_2转换为Temp_1,如果有需求则需再实现一个转换方法来完成两种类型对象互转。
implicit
在上述代码中仅把explicit改为implicit:
public static implicit operator Temp_1(Temp_2 t2) => new Temp_1(t2.Value1 + t2.Value2);
这时你会发现:
Temp_2 t2 = new Temp_2(123, 456);
Temp_1 t1 = t2;///去掉了(Temp_1)仍然可以完成转换
Console.WriteLine(t1.Value); ///会输出579
这便实现了隐式转换了。
注意:
同一种类型转换为另一种相同类型,实现了隐式转换你仍然可以使用显示转换的格式:
Temp_1 t1 = (Temp_1)t2;//显示转换格式