Statischer impliziter Operator

157

Ich habe kürzlich diesen Code gefunden:

 public static implicit operator XElement(XmlBase xmlBase)
 {
     return xmlBase.Xml;
 }

Was heißt static implicit operatordas

Bart
quelle

Antworten:

260

Dies ist ein Konvertierungsoperator . Dies bedeutet, dass Sie diesen Code schreiben können:

XmlBase myBase = new XmlBase();
XElement myElement = myBase;

Und der Compiler wird sich nicht beschweren! Zur Laufzeit wird der Konvertierungsoperator ausgeführt - myBaseals Argument übergeben und XElementals Ergebnis eine gültige zurückgegeben .

Auf diese Weise können Sie als Entwickler dem Compiler Folgendes mitteilen:

"Auch wenn diese Typen wie zwei völlig unabhängige Typen aussehen, gibt es tatsächlich eine Möglichkeit, von einem zum anderen zu konvertieren. Lassen Sie mich einfach die Logik dafür handhaben."

Rex M.
quelle
11
+1. Ich würde hinzufügen, dass implizite Konvertierungen gelegentlich gut genutzt werden, aber auch seltsame / überraschende Fehler verursachen und einen (menschlichen) API-Benutzer verwirren können. Beispielsweise gibt es in der BCL nur sehr wenige Verwendungen impliziter Konvertierungen. Mit Diskretion verwenden!
Drew Noakes
13

Eine solche implizite Operator Mittel können Sie konvertieren XmlBasezu XElementimplizit.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
Cheng Chen
quelle
Kann diese explizite Konvertierung trotzdem funktionieren? XElement xelement = (XElement)xmlBase;In der Frage heißt es static, was muss es statisch sein? Kann es nicht nicht statisch sein, damit es instanziiert werden kann?
aufstrebende
6

Eine weitere interessante Verwendung ist (die Unity durchgeführt hat, um zu überprüfen, ob ein Objekt (und damit eine Instanz von MonoBehavior) null ist):

public static implicit operator bool (CustomClass c)
{
    return c != null;
}

Beachten Sie, dass sich der Code innerhalb der Klasse befinden muss (in diesem Fall CustomClass). Auf diese Weise können Sie so etwas tun:

void Method ()
{
    CustomClass c1 = null;
    CustomClass c2 = new CustomClass ();

    bool b1 = c1; // is false
    bool b2 = c2; // is true

    if (!c1 && c2)
    {
        // Do stuff
    }
}

Offensichtlich könnte die berüchtigtste Verwendung darin bestehen, eine Ihrer Klassen in eine andere Ihrer Klassen umzuwandeln. Aber es lohnt sich auch, sie mit Grundtypen zu verwenden ... und ich sehe, dass dies ziemlich selten erwähnt wird.

Schlacht
quelle
1
Guter Trick! Eines ist zu beachten: Die static implicit operator boolMethode muss innerhalb der deklariert werden CustomClass. Ich habe eine DotNetFiddle dafür für Demozwecke erstellt.
Matt
1
@ Matt - Ah, meine Antwort ist jetzt 2 Jahre alt. Ich habe den Code ein wenig aktualisiert und Ihren Hinweis hinzugefügt.
Schlacht
4

Es ist ein impliziter Konvertierungsoperator (im Gegensatz zu einem expliziten Operator, für den die (type)Konvertierungssyntax erforderlich ist ).

Andrew Barber
quelle