Я не могу получить доступ к свойству Count массива, но через приведение к ICollection!

StackOverflow https://stackoverflow.com/questions/1031583

  •  06-07-2019
  •  | 
  •  

Вопрос

        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

У вас есть объяснение этому?

Это было полезно?

Решение

Массивы имеют. Длина, а не .Count.

Но это доступно (как явная реализация интерфейса ) в ICollection и т. д.

По сути, так же, как:

interface IFoo
{
    int Foo { get; }
}
class Bar : IFoo
{
    public int Value { get { return 12; } }
    int IFoo.Foo { get { return Value; } } // explicit interface implementation
}

Bar не имеет открытого свойства Foo - но оно доступно, если вы приведете к IFoo :

    Bar bar = new Bar();
    Console.WriteLine(bar.Value); // but no Foo
    IFoo foo = bar;
    Console.WriteLine(foo.Foo); // but no Value

Другие советы

Хотя System.Array реализует интерфейс ICollection , он не предоставляет напрямую свойство Count . Вы можете увидеть явную реализацию ICollection.Count в документации MSDN здесь .

То же самое относится и к IList.Item .

Посмотрите на эту запись в блоге, чтобы узнать больше о явной и неявной реализации интерфейса: Неявные и явные реализации интерфейса

Хотя это не отвечает на ваш вопрос напрямую , если вы используете .NET 3.5, вы можете включить пространство имен;

using System.Linq;

, который затем позволит вам использовать метод Count (), аналогично тому, как вы приводите массив int как ICollection.

using System.Linq;

int[] arr = new int[5];
int int_count = arr.Count();

У вас также есть целый ряд полезных функций, которые вы также можете использовать в Linq:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top