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 : 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
Utilisation:

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)
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 : 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
Comment éviter cette exception ?
Merci.