VB.Net - как поддерживать неявное преобразование типов, а также пользовательское равенство
-
02-07-2019 - |
Вопрос
Исправлено:Смотрите примечания внизу
Я реализую универсальный класс, который поддерживает две функции: неявное преобразование типов и пользовательские операторы равенства.Что ж, он также поддерживает равноправие, если он это делает.
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
В моем расширяющем операторе я выполняю некоторое отражение, вот почему я хотел иметь возможность выполнять неявное преобразование в строку, когда я выполняю сравнение или присваивание со строкой в левой части.
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
Конечно, класс немного сложнее, чем этот, но это дает мне все, что мне было нужно :)
Решение
Вам не следует переопределять оператор = .Если у вас есть неявные преобразования в такие типы, как string
или int
, затем пусть заменит оператор равенства по умолчанию.
Как правило, если вам нужно настроить равенство для класса, вы должны переопределить Equals(object)
способ.