lancer l'objet system.array vers int [] string ou d'autres objets de type
Je suis en train d'apprendre le c# et d'essayer de comprendre le "type" axés sur les aspects de celui-ci.
Donc l'autre jour, j'avais besoin de recevoir un Système.Tableau d'objet à partir d'une méthode.
Ensuite, j'ai essayé de travailler avec des objets individuels, donc j'ai essayé de l'aborder avec un index.
Le compilateur ne me laisse pas, en disant que Système.Objet de tableau ne prennent pas en charge l'indexation.
Mais n'est-ce pas le Tableau est la classe de base pour tous les tableaux (Système.Tableau sur msdn)? Comment est-ce que int[] prend en charge l'indexation et Tableau[] ne l'est pas?
voici un peu de code pour illustrer le problème:
int[] intArray = {1,2,3,4,5,6,7,8,9,10};
int t;
Array sysArray;
Console.WriteLine("{0}", intArray.GetType().ToString()); //output: System.Int32[]
sysArray = Array.CreateInstance(typeof(int), 10);
Console.WriteLine("{0}", sysArray.GetType().ToString()); //output: System.Int32[]
sysArray = intArray; //compiles ok
//t = sysArray[4]; This line produces error Error 2 Cannot apply indexing with [] to an
//expression of type 'System.Array'
//t = intArray[4]; This line compiles ok
Donc ce que nous avons ici est de 2 objets, qui semblent être du même type.
Mais l'un est la mise en œuvre de l'indexation et de l'autre ne l'est pas, comment est-il possible?
une référence pour les réponses
après lecture de vos commentaires, je crois que j'ai le sens des choses.
int[] et tableau d'objets. chacun des objets est une structure de type int32.
Tableau[] est un tableau d'objets. chacun des objets est une classe de type Tableau.
sens : un tableau de tableaux.
comme je peux afficher dans le code suivant:
Array[] sysArrayOfArray = new Array[SIZE_OF_THE_MOTHER_ARRAY];
sysArrayOfArray[0] = Array.CreateInstance(typeof(int),SIZE_OF_FIRST_CHILD_ARRAY);
sysArrayOfArray[1] = Array.CreateInstance(typeof(int),SIZE_OF_FIRST_SECOND_ARRAY);
et ainsi de suite...
alors j'ai compris pourquoi la façon dont j'ai essayé d'avoir accès aux éléments de sysArray était faux.
intArray -> 1 ensemble de nombreuses ints
sysArray -> 1 classe (qui permet d'accéder à de nombreux services de renseignements)
de la langue du point de vue sysArray n'est pas un Tableau, c'est seulement une référence à 1 objet (de type System.Array)
(désolé pour la répétition un peu, mais il aide vraiment à mettre les choses dans ma tête)
merci à vous tous pour les guider dans la compréhension de cette différence.
concernant les solutions.. que ce que je cherchais, et a travaillé pour moi le meilleur:
Array sysArray = Array.CreateInstance(typeof(int),3);
int[] intArray = new int[3];
int one, ten, hundred;
sysArray.SetValue(1, 0);
sysArray.SetValue(10,1);
sysArray.SetValue(100,2);
intArray = (int[])sysArray;//works, but forces me to create a new reference
one = ((int[])sysArray)[0];//works and is exactly what i was looking for...
ten = ((int[])sysArray)[1];
hundred = ((int[])sysArray)[2];
source d'informationauteur Eliy Arlev | 2011-12-30
Vous devez vous connecter pour publier un commentaire.
Casting sera de prendre soin de la différence:
Vous voyez que les deux tableaux sont de type
System.Int32[]
parce qu'ils sont (c'est pourquoi cette distribution fonctionne).int
est déclaré comme unstruct
dans leBCL
Tandis que
Array
est déclarée comme suit:De sorte qu'ils ne sont pas le même.
Si vous voulez obtenir des éléments de Tableau à l'aide d'un indexeur, je pense que vous aurez besoin pour ce faire:
La raison en est que la façon dont l'indexeur méthode est déclarée dans le Tableau:
Depuis
IList
est déclaré dans la signature, il signifie que vous aurez besoin de jetersysArray
dans unIList<int>
afin d'accéder à l'indexeur. Si, au lieu de cela, l'indexeur a été déclaré comme ceci:alors oui, vous pourriez faire
sysArray[0];
sans aucun problème.Vous avez à regarder les interfaces de chaque objet implémente.
Array
implémenteSystem.Collections.IList
qui fournit un objet de l'indexeur toutint
ne fournit pas deIList
mise en œuvre.Système.Tableau est une classe de base abstraite. La documentation de microsoft qui dit tout...
Système.Tableau n'est pas de fournir une implémentation pour l'indexeur.
Ce qui va travailler pour vous est ce...
En supposant
eventTypes
sont des objets contenant des valeurs entières (object[] eventTypes
):Vous pouvez lire les valeurs du Tableau en utilisant la fonction GetValue.