2010-10-29 5 views
12

Il me semble étrange d'être coulée nulle à un type, donc je voulais vérifier que ce soit la bonne façon de le faire:Est-il correct d'attribuer la valeur null à null lorsque l'expression ternaire est affectée à un type Nullable?

decimal? d = data.isSpecified ? data.Value : (decimal?)null; 

alt text

alt text

REMARQUE: I marque la réponse qui suggère la méthode que j'aime personnellement le meilleur:

decimal? d = data.isSpecified ? data.Value : default(decimal?) 
+1

Vous ne devriez pas avoir besoin de la distribution. 'decimal?' acceptera null, directement. –

+0

a ajouté une capture d'écran pour votre référence. –

+6

@Robert Harvey, vous avez raison de dire que 'decimal?' Acceptera null, mais le compilateur doit pouvoir déterminer le type de retour de l'expression ternaire, ce qu'il ne peut faire que si vous avez cast nul en 'decimal?'. –

Répondre

17

Oui, c'est bien. Alternatives:

condition ? (decimal?) value : null 

condition ? new decimal?(value) : null 

condition ? value : default(decimal?) 

condition ? value : new decimal?() 

Choisissez celui qui vous semble le plus lisible.

Vous ne pouvez rien faire en dehors de l'expression elle-même, car c'est le type d'expression que le compilateur ne connaît pas. Par exemple, mettre l'ensemble de l'expression entre crochets et la lancer n'aiderait pas.

+0

Cela fonctionnerait-il sans la distribution si 'value' était déjà' decimal? '? –

+0

@Robert: Oui, dans ce cas ce serait bien. Le problème est que le type de l'expression conditionnelle * soit * doit être le type du LHS * ou * le type du RHS ... et "null" n'a pas de type. –

2

Ye s, c'est parfaitement bien.

1

Est-ce que data.Value est de type decimal? Si oui, voici une notation alternative, sans la distribution:

decimal? d = data.isSpecified ? new decimal?(data.Value) : null; 
Questions connexes