explicit (C# リファレンス)

explicit キーワードは、キャストを使って呼び出す必要があるユーザー定義型の変換演算子を宣言します。 たとえば、この演算子は Fahrenheit というクラスを Celsius というクラスに変換します。

// Must be defined inside a class called Farenheit:
public static explicit operator Celsius(Fahrenheit f)
{
    return new Celsius((5.0f / 9.0f) * (f.degrees - 32));
}

この変換演算子は次のように呼び出すことができます。

Fahrenheit f = new Fahrenheit(100.0f);
Console.Write("{0} fahrenheit", f.Degrees);
Celsius c = (Celsius)f;

変換演算子は、変換元の型を変換先の型に変換します。 変換元の型が変換演算子を提供します。 暗黙の型変換の場合とは異なり、明示的な型変換演算子はキャストを使って呼び出す必要があります。 変換の演算によって例外が発生したり情報が失われたりする可能性がある場合、その変換には explicit キーワードを使用する必要があります。 これにより、予想外の結果を招く可能性がある変換演算がコンパイラによって暗黙的に呼び出されることがなくなります。

キャストを省略すると、コンパイル時のエラー CS0266 の原因になります。

詳細については、「変換演算子の使用 (C# プログラミング ガイド)」を参照してください。

使用例

次の例に示す Fahrenheit と Celsius の各クラスは、他方のクラスへの変換を行うための明示的な変換演算子を提供します。


class Celsius
{
    public Celsius(float temp)
    {
        degrees = temp;
    }
    public static explicit operator Fahrenheit(Celsius c)
    {
        return new Fahrenheit((9.0f / 5.0f) * c.degrees + 32);
    }
    public float Degrees
    {
        get { return degrees; }
    }
    private float degrees;
}

class Fahrenheit
{
    public Fahrenheit(float temp)
    {
        degrees = temp;
    }
    // Must be defined inside a class called Farenheit:
    public static explicit operator Celsius(Fahrenheit f)
    {
        return new Celsius((5.0f / 9.0f) * (f.degrees - 32));
    }
    public float Degrees
    {
        get { return degrees; }
    }
    private float degrees;
}

class MainClass
{
    static void Main()
    {
        Fahrenheit f = new Fahrenheit(100.0f);
        Console.Write("{0} fahrenheit", f.Degrees);
        Celsius c = (Celsius)f;

        Console.Write(" = {0} celsius", c.Degrees);
        Fahrenheit f2 = (Fahrenheit)c;
        Console.WriteLine(" = {0} fahrenheit", f2.Degrees);
    }
}
/*
Output:
100 fahrenheit = 37.77778 celsius = 100 fahrenheit
*/

1 桁の 10 進値を表す構造体 Digit を定義する例を次に示します。 byte 型から Digit 型へ変換するための演算子が定義されていますが、すべての byte 型を Digit 型に変換できるとは限らないため、この変換は明示的に行うように指定されています。

struct Digit
{
    byte value;
    public Digit(byte value)
    {
        if (value > 9)
        {
            throw new ArgumentException();
        }
        this.value = value;
    }

    // Define explicit byte-to-Digit conversion operator:
    public static explicit operator Digit(byte b)
    {
        Digit d = new Digit(b);
        Console.WriteLine("conversion occurred");
        return d;
    }
}

class ExplicitTest
{
    static void Main()
    {
        try
        {
            byte b = 3;
            Digit d = (Digit)b; // explicit conversion
        }
        catch (Exception e)
        {
            Console.WriteLine("{0} Exception caught.", e);
        }
    }
}
/*
Output:
conversion occurred
*/

C# 言語仕様

詳細については、「C# 言語仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

参照

処理手順

方法 : 構造体間にユーザー定義の変換を実装する (C# プログラミング ガイド)

参照

C# のキーワード

implicit (C# リファレンス)

operator (C# リファレンス)

概念

C# プログラミング ガイド

その他の技術情報

C# リファレンス

Chained user-defined explicit conversions in C# (C# でのユーザー定義の明示的な変換のチェーン)