List<int> test = {1, 2, 3} - est-il une fonction ou un bug?

Comme vous le savez, il n'est pas autorisé à utiliser le Tableau-initialisation de la syntaxe avec les Listes. Il va donner une erreur de compilation. Exemple:

List<int> test = { 1, 2, 3} 
//At compilation the following error is shown:
//Can only use array initializer expressions to assign to array types. 

Cependant aujourd'hui je n'ai la suite (très simplifié):

class Test
{
     public List<int> Field;
}

List<Test> list = new List<Test>
{
    new Test { Field = { 1, 2, 3 } }
};

Le code ci-dessus compile très bien, mais lorsqu'il est exécuté, il va donner une "références de l'Objet n'est pas définie pour un objet" erreur d'exécution.

Je m'attends à ce que le code à donner à une erreur de compilation. Ma question est la suivante: Pourquoi n'est-ce pas, et il y a toutes les bonnes raisons pour quand un tel scénario permettrait d'exécuter correctement?

Cela a été testé à l'aide .NET 3.5, les deux .Net et Mono compilateurs.

Acclamations.

Le plus simple exemple Test test= new Test { Field = { 1, 2, 3 }}; a le même comportement.
"Les références de l'Objet n'est pas définie pour un objet" est tout à fait logique, puisque votre Champ de liste n'est pas initialisé. Le Test organisme public List<int> Champ = new List<int>(); fait de cette course sans problème également.
prendre un réflecteur, et de voir comment le compilateur traite cela, et vous allez comprendre. aussi voir comment le var truc = new List<int>() {4,5}; est handeled

OriginalL'auteur mikabytes | 2011-02-04