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.