Définir les valeurs null de la propriété valeur par défaut Rien ne fonctionne pas comme souhaité
J'ai une propriété de type Nullable
de Integer
une valeur par défaut Nothing
comme indiqué ci-dessous:
Property TestId As Integer? = Nothing
le code suivant évalue la propriété TestId à Rien (comme souhaité)
Dim test As RadTreeNode = rtvDefinitionCreate.FindNodeByValue(DefinitionHeaderEnum.Test)
If test Is Nothing Then
definition.TestId = Nothing
Else
definition.TestId = test.Nodes(0).Value
End If
mais le code ci-dessous évalue à 0 (valeur par défaut pour Integer
, même quand Integer?
avec la valeur par défaut Nothing
)
Dim test As RadTreeNode = rtvDefinitionCreate.FindNodeByValue(DefinitionHeaderEnum.Test)
definition.TestId = If(IsNothing(test), Nothing, test.Nodes(0).Value)
Quel est le problème avec le code ci-dessus? Toute Aide??
(plus tard dans le code lors de l'appel de la propriété, la propriété comporte 0)
OriginalL'auteur ddieppa | 2012-07-12
Vous devez vous connecter pour publier un commentaire.
Il " parce que vous êtes à la compilation de votre code avec
Option Strict Off
.Si vous compilez votre code avec
Option Strict On
, le compilateur vous donnera une erreur, en vous disant qu'il ne peut pas convertir deString
àInteger?
, éviter de telles surprises au moment de l'exécution.C'est un sentiment bizarre que lors de l'utilisation de
properties
/ternary operator
/option strict off
dans VB.NET.Considérons le code suivant:
Une autre différence à prendre en compte:
permettra d'évaluer à
Nothing
maispermettra d'évaluer à
0
Vous pouvez créer une méthode d'extension pour faire le méchant de travail pour vous.
et de l'appeler comme
Option Strict On
n'aide pas ici depuis le Si de l'opérateur n'automatique élargir la conversion de Rien à 0 (type detest.Nodes(0).Value
) - mais la solution devrait fonctionner!Strictes Sur l' de l'aide ici dans le chemin qui va provoquer une erreur de compilation, en mettant en évidence le problème.
Pour moi
Dim i As Integer? = If(True, Nothing, 1)
ne provoque pas d'erreur de compilation mais le convertit en Rien à 0 et 0 à nullable 0.Oui, c'est vrai. Les arguments de votre opérateur ternaire sont
Nothing
et1
.1
est un entier, etNothing
est convertie en un entier aussi (0
), de sorte que le compilateur est heureux et sait l'opérateur ternaire retourne un entier. Mais essayezDim i As Integer? = If(True, Nothing, "SomeString")
. Le compilateur génère une erreur lors de l'Option Strict On
.j'ai bien fait de
definition.TestId = If(IsNothing(test), new Integer?, CType(test.Nodes(0).Value,Integer))
et cela fonctionne, mais avez à écrire beaucoup de code, toute solution élégante?OriginalL'auteur sloth