Un initialiseur de collection vide pour la propriété de liste donne la valeur null

Lorsque ThisIsAList ce code , il ThisIsAList pas ThisIsAList à une collection vide, comme je m’y attendais … ThisIsAList était null.

 void Main() { var thing = new Thing { ThisIsAList = {} }; Console.WriteLine(thing.ThisIsAList == null); // prints "True" } public class Thing { public List ThisIsAList { get; set; } } 

Pourquoi n’est-ce pas une erreur de compilation? Pourquoi le résultat est-il null ?


Je me demandais si une conversion implicite était peut-être en cours ici, mais les tentatives suivantes produisaient des erreurs de compilation:

 thing.ThisIsAList = Enumerable.Empty().ToArray(); List integers = { 0, 1, 2, 3 }; 

Selon la documentation MSDN sur les initialiseurs de collection , cela ressemble à un initialiseur de collection qui gère simplement l’appel de Add() pour vous. J’ai donc cherché des surcharges possibles dans List.Add , mais je n’ai rien trouvé qui, à mon avis, puisse s’appliquer.

Quelqu’un peut-il expliquer ce qui se passe ici à partir de la spécification C #?

Dans la section 7.6.10.2 des spécifications C # 5.0:

Un initialiseur de membre qui spécifie un initialiseur de collection après le signe égal est l’initialisation d’une collection incorporée. Au lieu d’affecter une nouvelle collection au champ ou à la propriété, les éléments fournis dans l’initialiseur sont ajoutés à la collection référencée par le champ ou la propriété . Le champ ou la propriété doit être d’un type de collection répondant aux exigences spécifiées au § 7.6.10.3.

(c’est moi qui souligne)

Ainsi, étant donné que votre initialiseur de collection est nested à l’intérieur d’un autre initialiseur d’object / de collection, le comportement consiste à résoudre le membre initialisé en une valeur, puis à append les éléments pertinents. Dans ce cas, la propriété est null , de sorte que la valeur null est résolue et que tous les éléments nuls de votre initialiseur sont ajoutés. Si vous avez réellement essayé d’append un élément, un NRE serait lancé puisque vous essayez d’append un élément à un object null .