2016-12-31 3 views
0

Pourquoi je ne peux pas définir Nothing to Nullable (Of Double) via un opérateur ternaire conditionnel mais que je peux directement?Nullable (Of) n'est pas défini sur Nothing dans l'opérateur ternaire conditionnel

Dim d As Double? = Nothing 
d = If(True, 0, Nothing) ' result: d = 0 
d = Nothing     ' result: d = Nothing 
d = If(False, 0, Nothing) ' result: d = 0 Why? 

Edit: Ces travaux (fonction de la réponse ci-dessous acceptée):

d = If(False, 0, New Integer?) 
d = If(False, CType(0, Double?), Nothing) 
d = If(False, 0, CType(Nothing, Double?)) 
+0

http://stackoverflow.com/a/ 1828205/1070452 – Plutonix

+0

'Option Strict On' vous donnera des commentaires beaucoup plus rapidement dans ce genre de situation – Fabio

Répondre

1

Nothing se transforme en un grand nombre de types, non seulement T?. Il peut heureusement se convertir à Double:

Function X() As Double 
    Return Nothing ' result: 0.0 
End Function 

ou Integer. C'est le sens de Nothing que vous utilisez dans If(X, 0, Nothing), parce que If a besoin des deuxième et troisième arguments pour correspondre dans le type: il le traite comme le type Integer, parce que c'est le type de 0.

spécifiant explicitement l'un des types comme nullable (soit Integer? ou Double? fonctionnerait) permet de la figure du compilateur ce que vous voulez:

d = If(False, CType(0, Double?), Nothing) ou d = If(False, 0, CType(Nothing, Double?))

+0

Je ne peux pas éditer mes commentaires pour le moment et je ne m'attendais pas à ce que le fait d'appuyer sur 'Entrée' posterait mon commentaire. Quoi qu'il en soit, j'ai marqué votre réponse. Aussi @Plutonix m'a indiqué le bon chemin. Merci à vous deux. – yarecky

+0

'Nothing' ne convertit pas c'est simplement la valeur par défaut du type. Pour 'int' c'est' 0', pour les types de référence c'est 'null' – Fabio

+0

@Fabio La spécification du langage le décrit comme une conversion, voir https://msdn.microsoft.com/fr-fr/library/aa711655(v = vs.71) .aspx. – hvd