ユーザー定義の明示的および暗黙的変換演算子

ユーザー定義型では、別の型との間にカスタムの暗黙的または明示的な変換を定義できます。 暗黙的変換では特別な構文を呼び出す必要はなく、代入やメソッド呼び出しなど、さまざまな状況で発生する可能性があります。 事前に定義された C# の暗黙的な変換は常に成功し、例外がスローされることはありません。 ユーザー定義の暗黙的な変換も同様に動作します。 カスタムの変換によって例外がスローされたり情報が失われたりする可能性がある場合は、明示的な変換として定義します。

ユーザー定義の変換は、is および as 演算子からは考慮されません。 ユーザー定義の明示的な変換を呼び出すには、キャスト式を使用します。

暗黙的または明示的な変換を定義するには、operator とそれぞれ implicit または explicit のキーワードを使用します。 変換を定義する型は、その変換のソース型またはターゲット型のいずれかである必要があります。 2 つのユーザー定義型間の変換は、2 つの型のどちらでも定義できます。

次の例は、暗黙的な変換と明示的な変換を定義する方法を示しています。

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 以降では、明示的な checked 変換演算子を定義できます。 詳細については、算術演算子に関する記事の「ユーザー定義のチェック演算子」セクションを参照してください。

また、事前に定義された C# 演算子をオーバーロードするには operator キーワードも使用します。 詳細については、「演算子のオーバーロード」を参照してください。

C# 言語仕様

詳細については、「C# 言語仕様」の次のセクションを参照してください。

関連項目