25 votes

Comment faire des Tableaux de mettre en œuvre des IList<T> sans la mise en œuvre de la propriété "Count" en C#?

Pour un temps très long, j'ai été curieux de connaître les éléments suivants:

int[] array = new int[1];
int iArrayLength = array.Length;    //1

Comme les tableaux de mettre en œuvre l'interface IList, le suivant est autorisé:

int iArrayCount = ((IList<int>)array).Count;    //still 1

MAIS:

int iArrayCount = array.Count;  //Compile error. WHY?
int iArrayLength = array.Length;    //This is what we learned at school!

La question: Comment un tableau mettre en oeuvre IList<T> (en particulier l' int Count { get; } de la propriété de IList<T>) sans lui permettant d'être utilisé sur la classe de base?

31voto

phoog Points 22667

Ceci est connu comme une interface explicite membre de mise en œuvre. L'interface de membre n'est pas exposé comme un membre du public de type, mais il l'est par la coulée de la référence pour le type d'interface.

Cela peut être fait en C# comme ceci:

interface I
{
    void M();
}

class C : I
{
    public int P { get; set; }
    void I.M() { Console.WriteLine("M!"); }
}

Vous pouvez ensuite utiliser ces types de comme ceci:

C obj = new C();
obj.P = 3;
((I)obj).M();

Mais cela ne compile pas:

obj.M();

Comme JeffN825 notes, l'une des raisons pour la mise en œuvre de l'interface de membres est explicitement qu'ils ne sont pas pris en charge par le type. Par exemple, Add déclenche une exception (de discussion). Une autre raison pour la mise en œuvre d'un membre explicitement, c'est qu'il est similaire à un membre du public avec un nom différent. C'est la raison pour Count est mis en œuvre de façon explicite; le correspondant membre du public est - Length. Enfin, certains membres sont mis en œuvre de manière implicite, à savoir, l'indexeur. Ces deux lignes de travail (en supposant arr est un tableau d' int):

arr[0] = 8;
((IList<int>)arr)[0] = 8;

12voto

Jeff Points 13306

Car un Tableau ne prend pas en charge toutes les fonctionnalités d'un IList (Ajouter/Supprimer/etc), IList.Le comte (et plusieurs autres méthodes) sont mises en œuvre à titre privé (de manière explicite). Vous pouvez voir cela dans le démontage:

int ICollection.Count

Si vous avez vraiment envie d'utiliser le Comte, que vous pourriez faire

((IList)myArray).Count

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X