如果相同的两个类型之间不存在标准转换,则用户定义类型可以定义自定义的与另一个类型之间的隐式或显式转换。隐式转换不需要调用特殊的语法,可以发生在各种情况下,例如,在赋值和方法调用中。预定义的 C# 隐式转换总是成功的,从不抛出异常。用户定义的隐式转换也应该以这种方式运行。如果自定义转换可能抛出异常或丢失信息,则将其定义为显式转换。

is 和 as 操作符不考虑用户定义的转换。使用强制转换表达式调用用户定义的显式转换。

分别使用 operator(运算符)和 implicit 或 explicit 关键字定义隐式或显式转换。定义转换的类型必须是该转换的源类型或目标类型。两个用户定义类型之间的转换可以在两种类型中任意一种中定义。

下面的例子演示了如何定义隐式和显式转换:

static void Main(string[] args)
    {
        try
            {
            var w = new Lei位 ( 7 );

            byte ZJ = w;
            Console . WriteLine ( ZJ ); // 输出 7

            Lei位 Wei = ( Lei位 ) w;
            Console . WriteLine ( Wei ); // 输出 7
            }
        catch ( Exception ex ) { Console . WriteLine ( ex . Message ); }
    }

public readonly struct Lei位
    {
        private readonly byte ZJ位;

        public Lei位 ( byte 位 )
        {
        if ( 位 > 9 )
            {
            throw new ArgumentOutOfRangeException ( nameof ( 位 ) , "“位”不能大于 9。" );
            }
        this . ZJ位 = 位;
        }

    public static implicit operator byte ( Lei位 位 ) => 位 . ZJ位;
    public static explicit operator Lei位 ( byte 字节 ) => new Lei位 (字节 );

    public override string ToString ( )
        {
        return $"{ZJ位}";
        }
    }

从 C# 11 开始,可以定义 checked 显式转换操作符。

还可以使用 operator 关键字重载预定义的 C# 操作符。


兔子码农
4 声望1 粉丝

一个酒晕子