次の方法で共有


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

ユーザー定義型は、同じ 2 つの型間に標準変換が存在しない場合に、別の型との間で暗黙的または明示的なカスタム変換を定義できます。 暗黙的な変換では、特別な構文を呼び出す必要はありません。また、割り当てやメソッドの呼び出しなど、さまざまな状況で発生する可能性があります。 定義済みの 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 以降では、 チェックされた 明示的な変換演算子を定義できます。 詳細については、算術演算子に関する記事の「ユーザー定義のチェック演算子」セクションを参照してください。

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

C# 言語仕様

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

こちらも参照ください