VB.Net - как поддерживать неявное преобразование типов, а также пользовательское равенство - PullRequest
3 голосов
/ 30 сентября 2008

Исправлено: см. Примечания внизу

Я реализую универсальный класс, который поддерживает две функции: неявное преобразование типов и пользовательские операторы равенства. Ну, он поддерживает и 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

Конечно, класс немного сложнее, но это дает мне все, что мне нужно:)

1 Ответ

2 голосов
/ 30 сентября 2008

Вы не должны переопределять оператор =. Если у вас есть неявное преобразование в типы, такие как string или int, тогда пусть по умолчанию используется оператор равенства.

Как правило, если вам нужно настроить равенство для класса, вы должны переопределить метод Equals(object).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...