Operatory implicit oraz explicit

Rozważmy, dwie zupełnie bezsensowne klasy:

class TextInfo
{
   public string Text { get; set; }
}
class NumberInfo
{
   public int Number { get; set; }
}

Następnie gdzieś w kodzie próbujemy dokonać konwersji:

NumberInfo numberInfo = new NumberInfo {Number = 43};

TextInfo textInfo1 = numberInfo; // konwersja niejawna
TextInfo textInfo2 = (TextInfo)numberInfo; // konwersja jawna

Czy, którakolwiek przedstawiona konwersja zakończy się sukcesem?Oczywiście, że nie – skąd .NET ma wiedzieć jak należy zamienić jeden typ na drugi? Na szczęście .NET dostarcza operatory zarówno do konwersji niejawnej (pierwszy przykład, jak i jawnej (drugi przykład). Operator implicit służy do konwersji niejawnej:

internal class TextInfo
{
   public string Text { get; set; }

   public static implicit operator TextInfo(NumberInfo numberInfo)
   {
       return new TextInfo {Text = numberInfo.Number.ToString()};
   }
}

Naturalnie, operator konwersji niejawnej umożliwia również konwersję jawną, zatem oba powyższe przykłady zostaną skompilowane z sukcesem. “Słabszym”, operatorem jest explicit – wyłącznie konwersja jawna:

internal class TextInfo
{
   public string Text { get; set; }

   public static explicit operator TextInfo(NumberInfo numberInfo)
   {
       return new TextInfo {Text = numberInfo.Number.ToString()};
   }
}

Osobiście nie miałem okazji zastosować w praktyce (w realnym projekcie) powyższych konstrukcji. Myślę jednak, że w bibliotekach matematycznych, algorytmach (choćby różne typy sieci neuronowych) ma to rację bytu. Szczególnie należy zastanowić się przed użyciem operatora implicit– może spowodować zamieszanie.

5 thoughts on “Operatory implicit oraz explicit”

  1. Jak już tak omawiasz te dziwne słowa kluczowe :] To może jeszcze napisz coś o ‘yield’.

  2. Yield akurat uzywam dosc czesto i uwazam za bardzo przydatne ale faktycznie, chyba nie jest zbyt popularne. Dzieki za pomysl:)

  3. Yield to jedno z pierwszych tego typu słów kluczowych jakie poznałem w C# – młody wtedy byłem, głupi, a idea obiektowości, interfejsów i enumeratorów do mnie nie przemawiała, a foreach mi się jednak podobał i chciałem aby moją pseudokolekcje można było sobie nim przeliterować 😀

Leave a Reply

Your email address will not be published.