Operador implícito estático

158

Recientemente encontré este código:

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

Que static implicit operatorsignifica

Bart
fuente

Respuestas:

263

Este es un operador de conversión . Significa que puedes escribir este código:

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

¡Y el compilador no se quejará! En el tiempo de ejecución, se ejecutará el operador de conversión: pasar myBasecomo argumento y devolver un resultado válido XElementcomo resultado.

Como desarrollador, es una forma de decirle al compilador:

"A pesar de que estos parecen dos tipos totalmente ajenos, en realidad hay una forma de convertir de uno a otro; solo déjenme manejar la lógica de cómo hacerlo".

Rex M
fuente
11
+1. Yo agregaría que si bien hay buenos usos ocasionales de la conversión implícita, también puede causar errores extraños / sorprendentes y puede confundir a un usuario API (humano). A modo de ejemplo, hay muy pocos usos de conversiones implícitas en el BCL. Úselo con discreción!
Drew Noakes
13

Tal implícitos medios de operador que puede convertir XmlBasea la XElementforma implícita.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
Cheng Chen
fuente
¿Puede esta conversión explícita funcionar de todos modos? XElement xelement = (XElement)xmlBase;En la pregunta que dice static, ¿qué tiene que ser estático? ¿No puede ser no estático, por lo que puede ser instanciado?
aspirante
6

Otro uso interesante es (que Unity hizo para verificar si un objeto (y, por lo tanto, una instancia de MonoBehavior) es nulo):

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

Tenga en cuenta que el código debe estar dentro de la clase (CustomClass en este caso). De esa manera puedes hacer algo como esto:

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

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

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

Obviamente, el uso más notorio podría ser usarlo para convertir una de sus clases en otra de sus clases. Pero también vale la pena considerar su uso con tipos básicos ... y veo que se menciona muy raramente.

Batalla
fuente
1
¡Buen truco! Una cosa a tener en cuenta: el static implicit operator boolmétodo debe ser declarado dentro de la CustomClass. He creado un DotNetFiddle para ello con fines de demostración.
Matt
1
@ Matt - Ah, mi respuesta tiene 2 años por ahora. Actualicé un poco el código y agregué su pista.
Batalla
4

Es un operador de conversión implícito (a diferencia de un operador explícito, que requiere la (type)sintaxis de conversión)

Andrew Barber
fuente