explicit (C# リファレンス)explicit (C# Reference)

explicit キーワードは、キャストを使用して呼び出す必要があるユーザー定義型変換演算子を宣言します。The explicit keyword declares a user-defined type conversion operator that must be invoked with a cast. たとえば、次の演算子は摂氏というクラスを華氏というクラスに変換します。For example, this operator converts from a class called Fahrenheit to a class called Celsius:

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

この変換演算子は、次のように呼び出すことができます。This conversion operator can be invoked like this:

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

変換演算子は、ソースの型をターゲットの型に変換します。The conversion operator converts from a source type to a target type. 変換演算子はソースの型によって提供されます。The source type provides the conversion operator. 暗黙的な変換とは異なり、変換演算子はキャストを使用して明示的に呼び出す必要があります。Unlike implicit conversion, explicit conversion operators must be invoked by means of a cast. 変換操作によって例外が発生したり、情報が失われる可能性がある場合は、その操作を explicit としてマークする必要があります。If a conversion operation can cause exceptions or lose information, you should mark it explicit. これにより、予期しない結果をもたらす可能性がある変換操作がコンパイラによって暗黙的に呼び出されるのを防止できます。This prevents the compiler from silently invoking the conversion operation with possibly unforeseen consequences.

キャストを省略すると、コンパイル時エラー CS0266 が返されます。Omitting the cast results in compile-time error CS0266.

詳しくは、「変換演算子の使用」をご覧ください。For more information, see Using Conversion Operators.

Example

次のコードは、Fahrenheit クラスと Celsius クラスを提供する場合の例です。これらの各クラスは、他方のクラスへの明示的な変換演算子を提供します。The following example provides a Fahrenheit and a Celsius class, each of which provides an explicit conversion operator to the other class.


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 Fahrenheit:
    public static explicit operator Celsius(Fahrenheit fahr)
    {
        return new Celsius((5.0f / 9.0f) * (fahr.degrees - 32));
    }
    public float Degrees
    {
        get { return degrees; }
    }
    private float degrees;
}

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

        Console.Write(" = {0} Celsius", c.Degrees);
        Fahrenheit fahr2 = (Fahrenheit)c;
        Console.WriteLine(" = {0} Fahrenheit", fahr2.Degrees);
    }
}
// Output:
// 100 Fahrenheit = 37.77778 Celsius = 100 Fahrenheit

Example

次のコードは、単一の 10 進数を表す構造体 (Digit) を定義する場合の例です。The following example defines a struct, Digit, that represents a single decimal digit. byteDigit に変換するための演算子が定義されていますが、すべてのバイトを Digit に変換できるとは限らないため、変換を explicit にしています。An operator is defined for conversions from byte to Digit, but because not all bytes can be converted to a Digit, the conversion is explicit.

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# language specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

関連項目See also

C# リファレンスC# Reference
C# プログラミング ガイドC# Programming Guide
C# のキーワードC# Keywords
implicitimplicit
演算子 (C# リファレンス)operator (C# Reference)
方法: 構造体間にユーザー定義の変換を実装するHow to: Implement User-Defined Conversions Between Structs
Chained user-defined explicit conversions in C# (C# でのユーザー定義の明示的変換の連結)Chained user-defined explicit conversions in C#