En new []
est une notation qui vous évite d'avoir à taper un type explicite des membres du tableau (ou qui vous permet de créer des tableaux dont les éléments ont un type anonyme), mais son inférence de type est limitée en ce sens que tous les éléments doivent partager le même type ou être implicitement convertibles en un type commun partagé par au moins un membre. Voir la spécification C#, section 7.6.10.4 :
Une expression de création de tableau de la troisième forme est appelée expression de création de tableau implicitement typée. Elle est similaire à la deuxième forme, sauf que le type de l'élément du tableau n'est pas explicitement donné, mais déterminé comme le meilleur type commun (§7.5.2.14) de l'ensemble des expressions dans l'initialisateur de tableau.
Voici des exemples d'expressions de création de tableau implicitement typées :
var a = new[] { 1, 10, 100, 1000 }; // int[]
var b = new[] { 1, 1.5, 2, 2.5 }; // double[]
var c = new[,] { { "hello", null }, { "world", "!" } }; // string[,]
var d = new[] { 1, "one", 2, "two" }; // Error
La dernière expression provoque une erreur de compilation parce que ni l'un ni l'autre des deux int
ni string
est implicitement convertible en l'autre, et il n'y a donc pas de meilleur type commun. Une expression de création de tableau explicitement typée doit être utilisée dans ce cas, par exemple en spécifiant que le type est object[]
. Il est également possible de convertir l'un des éléments en un type de base commun, qui deviendra alors le type d'élément déduit.
Le point clé ici est que le "meilleur type commun" ne peut être que l'un des types déjà présents. Comme Damien_Le_incrédule a souligné dans un commentaire : "Comme M. Lippert se plaît à le souligner autour de l'inférence, chaque fois qu'elle cherche le meilleur type commun, elle ne renvoie qu'un des types déjà présents - elle ne part pas à la chasse à l'ancêtre commun le plus dérivé." .
Ce n'est pas parce que chaque tableau peut être un object []
ne signifie pas qu'elle devrait. Du point de vue du compilateur, ce serait un choix trivial de dernier recours, mais un choix très contre-intuitif pour le développeur, je suppose.