VB.Net - como apoiar a conversão de tipo implícito, bem como a igualdade de costume
-
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:)
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)
.