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:
Utilisation:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Voyez vous mon problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
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
Comment éviter cette exception ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Merci.
Partager