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:)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top