質問

修正済み:下部のメモを参照

私は、暗黙的な型変換とカスタム等価演算子の2つの機能をサポートするジェネリッククラスを実装しています。まあ、それはIN平等もサポートします、そうするなら。

1) if ( "value" = myInstance ) then ...
2) Dim s As String = myInstance
3) Dim s As String = CType(myInstance,String)

私が抱えている問題は、#2の暗黙的な変換をサポートしている場合、変換が最も具体的でないと不平を言うため、等号演算子が機能しないことです。

私が受け取るエラーはこれです(簡潔にするために少し簡略化しています):

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.

これを実装する最良の方法は何ですか。同様に重要なことは、何を省くべきでしょうか?次の変換を実装しました

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

拡大演算子でいくつかの反射を行うため、左側の文字列と比較または割り当てを行うときに暗黙的にDOWNを文字列に変換できるようにしたかったのです。

A) SomeObject.StringPropertySetter = MyClass

修正(編集)

何が起きているのか理解できなかったので、実装したものに乗り越えました。基本型(つまり、string / double / guid)間の比較は、文字列(またはGuidなど)演算子としてctype(...)を拡張することにより行われます。最終的に、これらの関数を実装しただけで、クラスから基本型インスタンスへの割り当てに加えて、すべてのテストケースは引き続きパスします

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)    

コメントはCスタイルですが、コードはvb.netです

もちろん、クラスはそれよりも少し複雑ですが、それは私に必要なすべてを与えてくれます:)

役に立ちましたか?

解決

=演算子をオーバーライドしないでください。 string int などの型への暗黙的な変換がある場合は、デフォルトの等値演算子に引き継がせます。

一般的な規則として、クラスの平等をカスタマイズする必要がある場合は、 Equals(object)メソッドをオーバーライドする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top