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

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".


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;

¿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.


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)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.