explicit (C#-Referenz)explicit (C# Reference)

Das explicit-Schlüsselwort deklariert einen benutzerdefinierten Typkonvertierungsoperator, der mit einer Umwandlung aufgerufen werden muss.The explicit keyword declares a user-defined type conversion operator that must be invoked with a cast. Beispielsweise konvertiert dieser Operator aus einer Klasse „Fahrenheit“ in die Klasse „Celsius“: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));
}

Dieser Konvertierungsoperator kann wie folgt aufgerufen werden:This conversion operator can be invoked like this:

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

Der Konvertierungsoperator konvertiert aus einem Quelltyp in einen Zieltyp.The conversion operator converts from a source type to a target type. Der Quelltyp stellt den Konvertierungsoperator bereit.The source type provides the conversion operator. Im Gegensatz zur impliziten Konvertierung müssen explizite Konvertierungsoperatoren mittels einer Umwandlung aufgerufen werden.Unlike implicit conversion, explicit conversion operators must be invoked by means of a cast. Wenn eine Konvertierungsoperation Ausnahmen verursachen oder Informationen verlieren kann, kennzeichnen Sie es mit explicit.If a conversion operation can cause exceptions or lose information, you should mark it explicit. Dadurch wird verhindert, dass der Compiler den Konvertierungsvorgang mit möglicherweise unerwarteten Folgen aufruft.This prevents the compiler from silently invoking the conversion operation with possibly unforeseen consequences.

Das Auslassen der Umwandlung verursacht den Kompilierzeitfehler CS0266.Omitting the cast results in compile-time error CS0266.

Weitere Informationen finden Sie unter Verwenden von Konvertierungsoperatoren.For more information, see Using Conversion Operators.

BeispielExample

Im folgenden Beispiel wird eine Fahrenheit- und Celsius-Klasse bereitgestellt, von denen jede einen expliziten Konvertierungsoperator für die andere Klasse bereitstellt.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

BeispielExample

Das folgende Beispiel definiert eine Struktur, Digit, die eine einzelne Dezimalstelle darstellt.The following example defines a struct, Digit, that represents a single decimal digit. Ein Operator ist für die Konvertierungen von byte auf Digit definiert, aber da nicht alle Bytes in Digit konvertiert werden können, ist die Konvertierung explizit.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#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
C#-SchlüsselwörterC# Keywords
implicitimplicit
Operator (C#-Referenz)operator (C# Reference)
Gewusst wie: Implementieren von benutzerdefinierten Konvertierungen zwischen StrukturenHow to: Implement User-Defined Conversions Between Structs
Chained user-defined explicit conversions in C# (Verkettete benutzerdefinierte, explizite Konvertierungen in C#)Chained user-defined explicit conversions in C#