VB.Net - wie implizite Typumwandlung sowie individuelle Gleichheit unterstützen
-
02-07-2019 - |
Frage
Fixed: Siehe Anmerkungen unten
Ich bin eine generische Klasse implementieren, die zwei Funktionen, implizite Typumwandlung und benutzerdefinierte Gleichheitsoperator unterstützt. Nun, es unterstützt IN-Gleichheit als auch, wenn es das tut.
1) if ( "value" = myInstance ) then ...
2) Dim s As String = myInstance
3) Dim s As String = CType(myInstance,String)
Das Problem, das ich habe, ist, dass, wenn ich # 2, implizite Konvertierung unterstützen, dann kann ich nicht meine Gleichheitsoperatoren an die Arbeit, da sie über keine Umwandlung beklagen die spezifischste zu sein.
Der Fehler, den ich bekommen, ist dies (ein bisschen der Kürze halber vereinfacht):
Overload resolution failed because no accessible '=' is most specific for these arguments:
'Public Shared Operator =(obj As MyClass, data As String) As Boolean': Not most specific.
'Public Shared Operator =(data As String, obj As MyClass) As Boolean': Not most specific.
'Public Shared Operator =(obj1 As MyClass, obj2 As MyClass) As Boolean': Not most specific.
Was ist der beste Weg, dies zu realisieren. Ebenso wichtig ist, was soll ich weglassen? Ich habe die folgenden Konvertierungen implementiert
Operator =(ByVal data As String, ByVal obj As classType) As Boolean (and <>)
Operator =(ByVal obj As classType, byval data As String) As Boolean (and <>)
Operator =(ByVal obj1 As classType, ByVal obj2 As classType) As Boolean (and <>)
Equals(obj as Object) as Boolean
Equals(compareTo as classType ) as Boolean
Equals(compareTo as String) as Boolean
Widening Operator CType(ByVal source As String) As classType
Widening Operator CType(ByVal source As classType) as String
Narrowing Operator CType(ByVal inst As classType) As dataType
In meiner Erweiterung Operator ich einige Überlegungen zu tun, weshalb ich eine implizite konvertieren können, wollte String AB tun, wenn ich einen Vergleich oder eine Zuordnung mit der Zeichenfolge auf der linken Seite zu tun.
A) SomeObject.StringPropertySetter = MyClass
Fix (edit)
Ich ging weit über Bord, was ich realisierte, weil ich nicht verstehen, was geschieht. Ein Vergleich zwischen den Basistypen (dh String / double / GUID) erfolgt über die Aufweitung ctype (...) als String (oder die GUID usw.) Operators. Am Ende setzte ich gerade diese Funktionen und all meine Testfälle noch zusätzlich zu Zuordnung aus der Klasse zu einer Basistyp-Instanz übergeben,
Public Class MyClass(Of BaseType)
Widening Operator CType(ByVal source As dataType) As MyClass
Widening Operator CType(ByVal source As MyClass) As dataType //conv between inst & base
Equals() // for datatype, classType, object
Operator <>(MyClass,MyClass) // for comparison between two instances
Opeator =(MyClass,MyClass)
Kommentare sind c-Stil, aber Code ist vb.net
Natürlich ist die Klasse ist ein wenig komplizierter als das, aber das macht mir alles, was ich brauchte:)
Lösung
Sie sollten nicht den Operator = außer Kraft setzen. Wenn Sie implizite Konvertierung in Typen wie string
oder int
haben, dann lassen Sie den Standard-Gleichheits-Operator übernehmen.
Als allgemeine Regel gilt, wenn Sie Gleichheit für eine Klasse anpassen müssen, sollten Sie die Equals(object)
Methode außer Kraft setzen.