Исправлено: см. Примечания внизу
Я реализую универсальный класс, который поддерживает две функции: неявное преобразование типов и пользовательские операторы равенства. Ну, он поддерживает и 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 в String, когда я делаю сравнение или присваивание со строкой слева.
A) SomeObject.StringPropertySetter = MyClass
Исправлено (редактировать)
Я пошел слишком далеко в том, что я реализовал, потому что я не понимал, что происходит. Сравнение между базовыми типами (например, string / double / guid) происходит с помощью расширяющегося ctype (...) как оператора 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
Конечно, класс немного сложнее, но это дает мне все, что мне нужно:)