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.
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
aber zu
%Vor% Jetzt können Sie sehen, woher der NullReferenceException
kam!
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.
Tags und Links c# generics implicit-conversion