修正済み: 下部の注を参照してください
暗黙的な型変換とカスタム等価演算子の 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) 間の比較は、拡張 ctype(...) as String (または Guid など) 演算子を介して行われます。最後に、これらの関数を実装しただけで、クラスから基本型インスタンスへの割り当てに加えて、すべてのテストケースが引き続き通過します
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です
もちろん、クラスはそれよりも少し複雑ですが、必要なものはすべて揃っています:)