C# 实现类型转换 implicit、explicit

前言:

在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;//显示转换格式

你可能感兴趣的:(C# 实现类型转换 implicit、explicit)