VB.Net - como apoiar a conversão de tipo implícito, bem como a igualdade de costume

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Fixa: veja notas na parte inferior

Estou implementando uma classe genérica que suporta duas características, tipo de conversão implícita e operadores de igualdade personalizados. Bem, ele suporta IN-igualdade, bem como, se ele faz isso.

1) if ( "value" = myInstance ) then ...
2) Dim s As String = myInstance
3) Dim s As String = CType(myInstance,String)

O problema que estou tendo é que se eu apoiar # 2, conversão implícita, então eu não posso colocar minhas operadores de igualdade de trabalho, uma vez que eles se queixam nenhuma conversão sendo o mais específico.

O erro que eu vejo é esta (simplificado um pouco por brevidade):

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.

Qual é a melhor forma de implementar isso. Tão importante quanto isso, o que eu deveria deixar de fora? Eu tenho implementado as seguintes conversões

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

Na minha operador alargando eu faço alguma reflexão, razão pela qual eu queria ser capaz de fazer uma BAIXO convertido implícita para String quando eu faço uma comparação ou atribuição com a corda no lado esquerdo.

A) SomeObject.StringPropertySetter = MyClass

Fix (edit)

Eu fui maneira ao mar em que eu implementadas, porque eu não entendia o que estava acontecendo. Comparação entre os tipos de base (ou seja, de cordas / duplo / guid) é realizada através do ctype alargamento (...) na forma de corda (ou GUID, etc) operador. No final, eu só implementou essas funções e todos os meus casos de teste ainda passar, além de atribuição da classe para uma instância de tipo base

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)    

comentários são c estilo, mas o código é vb.net

É claro que a classe é um pouco mais complicado do que isso, mas isso me dá tudo que eu precisava:)

Foi útil?

Solução

Você não deve substituir o operador =. Se você tem conversões implícitas para tipos como string ou int, em seguida, deixar o operador de igualdade padrão assumir.

Como regra geral, se você precisa para personalizar a igualdade para uma classe, você deve substituir o método Equals(object).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top