2016-08-15 2 views
1

Pourquoi la ligne ci-dessous compile-t-elle? Pour moi, Nullable<double> est une structure et nous ne pouvons pas attribuer à une variable de ce type la valeur "null".Pourquoi pouvez-vous attribuer une valeur null à une variable nullable?

 Nullable<double> someVar = null; 

L'opérateur n'est pas censé assignation être Overridable mais peut-être il est un peu de sucre de syntaxe et le compilateur sait qu'il doit changer pour?

 Nullable<double> someVar = new Nullable<double>(); 
     someVar.Value = null; 
+4

Est-ce une question existentielle? – Krythic

+0

Je pense qu'il pourrait être ... –

+0

Il n'y a pas de sucre syntaxique dans ce que vous avez écrit. AKAIK. – user3185569

Répondre

6

Le compilateur et la spécification de langage ont un soutien spécial magique qui rend la voiture décapotable littérale null à Nullable<T>.

Le spec says:

  • A null littéral. Une expression avec cette classification peut être implicitement convertie en un type de référence ou un type Nullable.
4

C'est sur la spécification.

Section 6.1.5 dit:

6.1.5 Null conversions littérales

Une conversion implicite existe de la valeur littérale NULL à tout type nullable. Cette conversion produit la valeur nulle (§4.1.10) du type nullable donné

Et 4.1.10 dit:

4.1.10 types nullables

Un type Nullable peut représente toutes les valeurs de son type sous-jacent plus une valeur nulle supplémentaire. Un type NULL est écrit T ?, où T est le type sous-jacent. Cette syntaxe est un raccourci pour System.Nullable, et les deux formes peuvent être utilisées de manière interchangeable.

...

conversions implicites sont disponibles à partir du zéro littéral à T? (§6.1.5) et de T à T? (§6.1.4)

(gras est le mien)