分享方式:


使用者定義的明確和隱含轉換運算子

使用者定義型別可定義要互換型別的自訂隱含轉換和明確轉換。 隱含轉換不需要特殊的語法即可叫用,且可能在各種的情況下發生,例如在指派和方法引動過程中發生。 預先定義的 C# 隱含轉換一定會成功,且絕對不會擲回例外狀況。 使用者定義的隱含轉換也應該以類似方式運作。 如果自訂的轉換可能擲回例外狀況或遺失資訊,請將其定義為明確轉換。

isas 運算子不會考慮使用者定義的轉換。 使用轉換運算子來叫用使用者定義的明確轉換。

使用 operatorimplicitexplicit 關鍵字,分別定義隱含或明確轉換。 您用來定義轉換的型別必須是來源型別或該轉換的目標型別。 您可以將兩個使用者定義型別之間的轉換定義為兩個型別其中之一。

下面範例說明如何定義隱含和明確轉換:

using System;

public readonly struct Digit
{
    private readonly byte digit;

    public Digit(byte digit)
    {
        if (digit > 9)
        {
            throw new ArgumentOutOfRangeException(nameof(digit), "Digit cannot be greater than nine.");
        }
        this.digit = digit;
    }

    public static implicit operator byte(Digit d) => d.digit;
    public static explicit operator Digit(byte b) => new Digit(b);

    public override string ToString() => $"{digit}";
}

public static class UserDefinedConversions
{
    public static void Main()
    {
        var d = new Digit(7);

        byte number = d;
        Console.WriteLine(number);  // output: 7

        Digit digit = (Digit)number;
        Console.WriteLine(digit);  // output: 7
    }
}

從 C# 11 開始,您可以定義已檢查的明確轉換運算子。 如需詳細資訊,請參閱算術運算子一文中的使用者定義的已檢查運算一節。

您也可以使用 operator 關鍵字來多載預先定義的 C# 運算子。 如需詳細資訊,請參閱運算子多載

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格的下列幾節:

另請參閱