Objet Null avec opérateurs
Bonjour a tous,
Je souhaite développer une classe semblable à System.DbNull afin de représenter un objet Null de base de données et en plus de System.DbNull, intégrer des opérateurs de comparaison et de transtypage (cast).
Jusque là aucun problème j'ai une classe du style:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| Public Notinheritable Class MyNull
Public Shared ReadOnly Value As New MyNull
Public Shared Operator = (ByVal v1 As MyNull, ByVal v2 as MyNull) As
Boolean
Return(True)
End Operator
Public Shared Operator = (ByVal v1 As MyNull, ByVal v2 as Object) As
Boolean
Return(False)
End Operator
Public Shared Operator = (ByVal v1 As Object, ByVal v2 as MyNull) As
Boolean
Return(False)
End Operator
Public Shared Narrowing Operator CType(ByVal v As MyNull) As String
Return(String.Empty)
End Operator
Private Sub New()
End Sub
End Class |
Utilisation:
Code:
1 2 3 4 5 6 7 8 9 10 11
| Dim v1 As Object = MyNull.Value
Dim v2 As MyNull = MyNull.Value
?v1 = 1 '--> False
?v2 = 1 '--> False
?v1 = v2 '--> True
?v2 = v1 '--> True
?Cstr(v2) '--> "" (String.Empty)
?Cstr(v1) '--> Exception InvalidCastOperation !!! ???
?Cstr(CType(v1, MyNull)) '--> "" (String.Empty) |
Voyez vous mon problème ?
Je ne comprends pas pourquoi l'opérateur = est appelé que ce soit à partir de l'instance MyNull (v2) ou Object (v1), alors que l'opérateur CType n'est appelé que depuis l'instance MyNull (v2)
Lorsque j'inspecte v1 comme v2 avec le debugger, ils sont tous 2 de type MyNull
Sachant que j'ai une fonction qui me retourne un type Object qui peut donc etre Integer, String, Decimal, Byte, ..., MyNull je ne peut donc effectuer de transtypage si le retour est MyNull sous Object
Code:
1 2 3 4 5 6 7 8 9
| Dim MaChaine As String = MaFonction() '--> Exception si le retour est MyNull
Public Function MaFonction() As Object
Dim Result As Object = xxxx
If IsDBNull(Result) Then
Result = MyNull.Value
End If
Return (Result)
End Function |
Comment éviter cette exception ?
Merci.