VB.Net - как поддерживать неявное преобразование типов, а также пользовательское равенство

StackOverflow https://stackoverflow.com/questions/151318

  •  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) способ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top