1
votes

Comment est-il possible de créer une instance d'IList?

En C # je comprends qu'on ne peut pas créer une instance d'une interface:

> new List<double> { null }
(1,20): error CS1950: The best overloaded Add method 'List<double>.Add(double)' for the collection initializer has some invalid arguments
(1,20): error CS1503: Argument 1: cannot convert from '<null>' to 'double'

Mais aujourd'hui j'ai vu le code suivant:

> new IList<double>[3]
IList<double>[3] { null, null, null }

N'est-ce pas étrange! Comment est-ce possible?

En particulier, comment null peut-il être un élément, alors que double n'est pas nul?

> new IList<double>()
(1,1): error CS0144: Cannot create an instance of the abstract class or interface 'IList<double>'

Que se passe-t-il?


4 commentaires

C'est similaire à double [3] en ce que vous créez un tableau qui contiendra double et le tableau a une taille de 3 éléments. La seule différence ici est le type contenant, le tableau de votre question est de IList (au lieu de double ).


Ce n'est pas étrange. Le premier extrait de code a essayé de créer une instance d'une interface, ce qui est impossible. Le second a tenté de créer un tableau d'éléments IList avec des valeurs par défaut, c'est-à-dire null . Le troisième a tenté de stocker un null dans un conteneur destiné à contenir des instances doubles


Celui qui a voté pour fermer a tort. Ce n'est pas une simple erreur typographique car le demandeur ne comprend pas les effets de la syntaxe sur laquelle il est tombé par hasard et a une question sur l'effet de cela.


@JonHanna Non, ce n'est pas quelqu'un qui ne sait pas ce qu'est un tableau (si c'était le cas, ce serait un doublon, au fait). C'est quelqu'un qui n'a tout simplement pas remarqué qu'il créait un tableau au lieu d'un IList (c'est-à-dire une simple erreur typographique). Sinon, vous avez apparemment une vraiment mauvaise opinion du PO.


3 Réponses :


8
votes

Ce que vous avez là est un tableau de IList, qui est plein de null. Considérez:

new IList<double>[3] { new List<double>() { 1, 2, 3 }, null, null }


1 commentaires

Merci. Je n'ai pas reconnu IList [3] comme un tableau de listes.



4
votes

new IList [3] crée un new IList [] , c'est-à-dire un tableau où les éléments sont chacun new IList .

Par exemple, vous pouvez faire:

var arr = new IList<double>[3];
arr[0] = new List<double>();


0 commentaires

0
votes

En regardant attentivement la sortie, vous pouvez distinguer les structures de données à une et deux dimensions.

Une liste simple (à une dimension):

> new IList<string>[3]
IList<string>[3] { null, null, null }

Un tableau de listes ( bidimensionnel):

> new List<string> { null, null, null }
List<string>(3) { null, null, null }

Entre crochets, 3 indique la longueur d'un tableau. Entre parenthèses, 3 indique la longueur d'une liste.


0 commentaires