Quelle est la différence entre T et T ?

Mon Google-Jitsu me fait défaut. La question se trouve dans le titre … Quelle est la différence entre T[,] et T[*,*] ? Je cherche une réponse en 2, 2-1 / 2 parties:

  1. Explication en anglais simple de Layman (ou du super architecte) avec exemple de code.

  2. Lien vers la documentation formelle de cette distinction.

    Bonus: pointez le numéro de sous-section et de page dans la spécification C # 4 qui définit cela. (Ce n’est pas dans la section 12 “Tableaux”)

J’ai cette idée ici .

T[] signifie un tableau de T de base zéro (le tableau [0] est son premier élément)

T[*] signifie un tableau de T autre que zéro (le tableau [0] n’est pas son premier élément et peut même être hors limites)

Le lien de votre question explique qu’il n’y a pas de tableau de type T[*,*] , car tous les tableaux multidimensionnels de T[,] sont traités comme des tableaux de borne inférieure inconnue.

L’extrait de code ci-dessous montre comment créer une instance de T[*] . Notez que vous ne pouvez pas le convertir en T[] , car ils sont de types différents. a[0] lève ici une exception OutOfRangeException, l’indice du premier élément de ce tableau est 1 (ah, bon vieux Pascal …) .

 Array a = Array.CreateInstance(typeof(Ssortingng), new Int32[] { 1 }, new Int32[] { 1 }); Console.WriteLine(a.GetType()); // System.Ssortingng[*] 

Plus de code d’exemple

Prime. La spécification du langage C # indique: “Les indices des éléments d’un tableau vont de 0 à Longueur – 1” . De toute évidence, le langage ne fournit pas de support intégré pour les tableaux non basés sur zéro, il s’agit simplement d’une structure de données personnalisée que vous pouvez créer. Bien que spécifique dans le sens où le compilateur a un symbole spécial pour son type, VS utilise un visualiseur de tableau standard pour eux lors du débogage.

Voir également:

Comment créer un tableau à 1 dimension en C # avec un index commençant à 1

C #: les tableaux basés sur des valeurs autres que zéro ne sont pas conformes à CLS

En fait

C # supporte les tableaux à une dimension … en quelque sorte.

Eh bien, si … si vous utilisez var .

Tout d’abord, vous devez comstackr ceci dans un assemblage utilisant ILAsm.exe (je sais, ce n’est pas encore C # … pour le moment):

 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) .ver 2:0:0:0 } .assembly ArrayHelper { } .module ArrayHelper.dll .subsystem 0x0003 .class public ArrayHelper { .method public hidebysig static !!T[...] CastTo1D(class [mscorlib]System.Array 'array') cil managed { ldarg.0 castclass !!T[...] ret } .method public hidebysig static !!T[...] Create1D(int32 len) cil managed { ldarg.0 newobj instance void !!T[...]::.ctor(int32) ret } .method public hidebysig static !!T[...] Create1D(int32 lowerBound, int32 length) cil managed { ldarg.0 ldarg.1 newobj instance void !!T[...]::.ctor(int32, int32) ret } } 

Ensuite, vous pouvez faire quelque chose comme:

 var my1DArray = ArrayHelper.Create(1, 5); 

créer un tableau 1-D de longueur 5 avec la limite inférieure 1.

Heck, même Visual Studio prend en charge cela!

Capture d'écran de Visual Studio

J’espère que vous vous amusez avec.