impliziter Operator für generische Typen

8

Stimmt etwas nicht mit der Verwendung eines impliziten Operators wie dem folgenden:

%Vor%

Ich dachte, ich könnte so eine Instanz des Objekts als Werttyp behandeln, aber da ich noch nie ein Beispiel dafür gesehen habe, dachte ich, dass es vielleicht einen Grund dafür gäbe, nicht zu tun so etwas, auf das jemand hinweisen könnte?

In meinem eigentlichen Code habe ich darüber nachgedacht, dies als Teil einer Datenabstraktionsschicht zu tun, so dass ich Objekte mit Informationen zurückgeben könnte, die die zugrunde liegenden Daten beschreiben, aber dem Logikcode erlauben, ihn als Wertetyp zu behandeln zu wissen, ist der Wert, und gleichzeitig halten Sie alles schön und geben Sie sicher mit den Generika.

    
asawyer 29.09.2010, 15:32
quelle

2 Antworten

10

Wenn alle folgenden Aussagen zutreffen:

  • alle möglichen Werte Ihres MyClass<T> -Typs (einschließlich null , wenn es sich nicht um einen Werttyp handelt!) auf einen gültigen Wert von T

  • wirft der implizite Operator niemals (nicht einmal für null !)

  • Die implizite Konvertierung macht semantischen Sinn und ist nicht verwirrend für den Client-Programmierer

Dann ist nichts falsch daran. Natürlich könntest du etwas von diesen drei Dingen tun, aber es wäre schlechtes Design. Insbesondere ein impliziter Operator, der Würfe ausführt, kann sehr schwer zu debuggen sein, da der Ort, an dem er aufgerufen wird, nicht besagt, dass er aufgerufen wird.

Beispiel: T? hat keine implizite Konvertierung in T (wobei T natürlich ein Werttyp ist). Wenn es einen solchen impliziten Operator gäbe, müsste er " T? " als "null" ausgeben, da es keinen offensichtlichen Wert gibt, der null in einen Wert konvertiert, der für beliebigen -Werttyp% co_de sinnvoll wäre %.

Lassen Sie mich ein Beispiel geben, wo ich Probleme hatte, ein Problem zu debuggen, bei dem der implizite Operator folgendes warf:

%Vor%

Hier hat T etwas von einem Typ zurückgegeben, den ich geschrieben habe und der eine benutzerdefinierte implizite Umwandlung in GetSomething hat. Ich habe absolut sicher gemacht dass string nie GetSomething zurückgeben kann, und trotzdem habe ich null ! Warum? Weil der obige Code nicht entspricht

%Vor%

aber zu

%Vor%

Jetzt können Sie sehen, woher der NullReferenceException kam!

    
Timwi 29.09.2010, 15:35
quelle
1

Das ist ein großartiges Muster. Beachten Sie, dass Sie, um es als eine Variable vom Typ T zu verwenden, entweder explizit auf T oder auf eine Variable vom Typ T umstellen müssen. Die Umwandlung findet automatisch in Methodenaufrufen und anderen Dingen statt (z. B. in Ihrem zusätzlichen Beispiel), die ein T übernehmen.

Implizite Konvertierung ohne Zuweisung?

    
arootbeer 29.09.2010 15:35
quelle