Operatore implicito statico


158

Recentemente ho trovato questo codice:

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

Cosa static implicit operatorsignifica?

Risposte:


263

Questo è un operatore di conversione . Significa che puoi scrivere questo codice:

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

E il compilatore non si lamenterà! In fase di esecuzione, verrà eseguito l'operatore di conversione, passando myBasecome argomento e restituendo un valore valido XElementcome risultato.

È un modo per te come sviluppatore di dire al compilatore:

"anche se questi sembrano due tipi totalmente indipendenti, in realtà esiste un modo per convertire da uno all'altro; lasciami solo gestire la logica per come farlo."


11
+1. Vorrei aggiungere che mentre ci sono occasionali buoni usi della conversione implicita, può anche causare bug strani / sorprendenti e può confondere un utente API (umano). A titolo di esempio, ci sono pochissimi usi di conversioni implicite nel BCL. Usa con discrezione!
Ha disegnato Noakes il

13

Un operatore così implicito significa che puoi convertirlo XmlBasein modo XElementimplicito.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;

questa conversione esplicita può funzionare comunque? XElement xelement = (XElement)xmlBase;Nella domanda dice static, che cosa deve essere statico? Non può essere non statico, quindi può essere istanziato?
aspirante

6

Un altro utilizzo interessante è (che Unity ha fatto per verificare se un oggetto (e quindi un'istanza di MonoBehavior) è null):

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

Si noti che il codice deve essere all'interno della classe (CustomClass in questo caso). In questo modo puoi fare qualcosa del genere:

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

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

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

Ovviamente l'uso più noto potrebbe essere usarlo per convertire una delle tue classi in un'altra delle tue classi. Ma vale anche la pena usarli con tipi di base ... e lo vedo menzionato abbastanza raramente.


1
Bel trucco! Una cosa da notare: il static implicit operator boolmetodo deve essere dichiarato all'interno del CustomClass. Ho creato un DotNetFiddle per questo a scopo dimostrativo.
Matt,

1
@Matt - Ah, la mia risposta ha ormai 2 anni. Ho aggiornato un po 'il codice e aggiunto il tuo suggerimento.
Battaglia

4

È un operatore di conversione implicito (al contrario di un operatore esplicito, che richiede la (type)sintassi di conversione)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.