Statyczny operator niejawny

157

Niedawno znalazłem ten kod:

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

Co to static implicit operatorznaczy?

Bart
źródło

Odpowiedzi:

262

To jest operator konwersji . Oznacza to, że możesz napisać taki kod:

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

A kompilator nie będzie narzekał! W czasie wykonywania zostanie wykonany operator konwersji - przekazujący myBasejako argument i zwracający prawidłowy XElementwynik.

Jest to sposób, w jaki programista może powiedzieć kompilatorowi:

„nawet jeśli wyglądają na dwa zupełnie niepowiązane typy, w rzeczywistości istnieje sposób na konwersję z jednego do drugiego; pozwól mi tylko zająć się logiką, jak to zrobić”.

Rex M
źródło
11
+1. Dodałbym, że chociaż czasami zdarzają się dobre zastosowania niejawnej konwersji, może ona również powodować dziwne / zaskakujące błędy i może zmylić (ludzkiego) użytkownika API. Na przykład istnieje bardzo niewiele zastosowań niejawnych konwersji w BCL. Używaj dyskretnie!
Drew Noakes
13

Taki niejawny operator oznacza, że ​​można przekonwertować XmlBasena XElementniejawny.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
Cheng Chen
źródło
czy ta wyraźna konwersja może i tak działać? XElement xelement = (XElement)xmlBase;W pytaniu, które mówi static, co to musi być statyczne? Czy nie może być statyczny, więc można go utworzyć?
aspirujący
6

Innym interesującym zastosowaniem jest (które Unity zrobiło, aby sprawdzić, czy obiekt (a tym samym instancja MonoBehavior) jest null):

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

Zwróć uwagę, że kod musi znajdować się wewnątrz klasy (w tym przypadku CustomClass). W ten sposób możesz zrobić coś takiego:

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

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

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

Oczywiście najbardziej znanym zastosowaniem może być użycie go do konwersji jednej z twoich klas na inną. Ale używanie ich z podstawowymi typami również jest warte rozważenia ... i rzadko o tym wspominam.

Bitwa
źródło
1
Niezła sztuczka! Jedną rzeczą uwaga: static implicit operator boolmetoda musi być zadeklarowane wewnątrzCustomClass . Stworzyłem dla niego DotNetFiddle do celów demonstracyjnych.
Matt
1
@Matt - Ach, moja odpowiedź ma już 2 lata. Zaktualizowałem trochę kod i dodałem twoją wskazówkę.
Bitwa
4

Jest to niejawny operator konwersji (w przeciwieństwie do operatora jawnego, który wymaga (type)składni konwersji)

Andrew Barber
źródło