Je ne peux pas accéder à la propriété Count du tableau mais par le biais de la conversion vers ICollection!
-
06-07-2019 - |
Question
int[] arr = new int[5];
Console.WriteLine(arr.Count.ToString());//Compiler Error
Console.WriteLine(((ICollection)arr).Count.ToString());//works print 5
Console.WriteLine(arr.Length.ToString());//print 5
Avez-vous une explication à cela?
La solution
Les tableaux ont une longueur, pas un nombre.
Mais ceci est disponible (en tant que implémentation d'interface explicite ) sur ICollection, etc.
Essentiellement, identique à:
interface IFoo
{
int Foo { get; }
}
class Bar : IFoo
{
public int Value { get { return 12; } }
int IFoo.Foo { get { return Value; } } // explicit interface implementation
}
La barre
n'a pas de propriété publique Foo
- mais elle est disponible si vous convertissez en IFoo
:
Bar bar = new Bar();
Console.WriteLine(bar.Value); // but no Foo
IFoo foo = bar;
Console.WriteLine(foo.Foo); // but no Value
Autres conseils
Bien que System.Array
implémente l'interface ICollection
, il n'expose pas directement la propriété Count
. Vous pouvez voir l'implémentation explicite de ICollection.Count
dans la documentation MSDN ici .
Il en va de même pour IList.Item
.
Consultez cette entrée de blog pour plus de détails sur la mise en œuvre d'interface explicite et implicite: Implémentations d'interface implicites et explicites
Bien que cela ne réponde pas directement à votre question , , vous pouvez inclure l'espace de noms si vous utilisez .NET 3.5;
.using System.Linq;
qui vous permettra ensuite d'utiliser une méthode Count (), similaire à la conversion de votre tableau int en ICollection.
using System.Linq;
int[] arr = new int[5];
int int_count = arr.Count();
Vous avez également toute une série de fonctions utiles que vous pouvez également utiliser dans Linq:)