Opérateur implicite statique

158

J'ai récemment trouvé ce code:

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

Que veut static implicit operatordire?

Bart
la source

Réponses:

263

Ceci est un opérateur de conversion . Cela signifie que vous pouvez écrire ce code:

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

Et le compilateur ne se plaindra pas! Au moment de l'exécution, l'opérateur de conversion sera exécuté - en passant myBasecomme argument et en retournant un valide XElementcomme résultat.

C'est un moyen pour vous en tant que développeur de dire au compilateur:

"même si ceux-ci ressemblent à deux types totalement indépendants, il existe en fait un moyen de passer de l'un à l'autre; laissez-moi simplement gérer la logique de la façon de le faire."

Rex M
la source
11
+1. J'ajouterais que même s'il y a de bons usages occasionnels de la conversion implicite, cela peut aussi causer des bogues étranges / surprenants, et peut confondre un utilisateur (humain) d'API. A titre d'exemple, il y a très peu d'utilisations des conversions implicites dans la BCL. A utiliser avec discrétion!
Drew Noakes
13

Un tel opérateur implicite signifie que vous pouvez convertir XmlBaseen XElementimplicitement.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
Cheng Chen
la source
cette conversion explicite peut-elle quand même fonctionner? XElement xelement = (XElement)xmlBase;Dans la question qu'il dit static, qu'est-ce que cela doit être statique? Ne peut-il pas être non statique, donc il peut être instancié?
aspirant le
6

Une autre utilisation intéressante est (qu'Unity a fait pour vérifier si un objet (et donc une instance de MonoBehavior) est nul):

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

Notez que le code doit être à l'intérieur de la classe (CustomClass dans ce cas). De cette façon, vous pouvez faire quelque chose comme ceci:

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

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

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

De toute évidence, l'utilisation la plus notoire pourrait être de l'utiliser pour convertir une de vos classes en une autre de vos classes. Mais les utiliser avec des types de base vaut également la peine d'être pris en compte ... et je le vois rarement mentionné.

Bataille
la source
1
Joli tour! Une chose à noter: la static implicit operator boolméthode doit être déclarée dans le fichierCustomClass . J'ai créé un DotNetFiddle pour cela à des fins de démonstration.
Matt le
1
@Matt - Ah, ma réponse a maintenant 2 ans. J'ai mis à jour un peu le code et ajouté votre indice.
Bataille le
4

C'est un opérateur de conversion implicite (par opposition à un opérateur Explicit, qui nécessite la (type)syntaxe de conversion)

Andrew Barber
la source