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?
3 Réponses :
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 }
Merci. Je n'ai pas reconnu IList comme un tableau de listes.
new IList 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>();
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.
C'est similaire à
double [3]en ce que vous créez un tableau qui contiendradoubleet le tableau a une taille de 3 éléments. La seule différence ici est le type contenant, le tableau de votre question est deIList (au lieu dedouble).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-à-direnull. Le troisième a tenté de stocker unnulldans un conteneur destiné à contenir des instancesdoublesCelui 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.