Я не могу получить доступ к свойству Count массива, но через приведение к ICollection! - PullRequest
1 голос
/ 23 июня 2009
        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

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

Ответы [ 3 ]

6 голосов
/ 23 июня 2009

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

Но это доступно (как явная реализация интерфейса ) на 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
3 голосов
/ 23 июня 2009

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

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

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

1 голос
/ 23 июня 2009

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

using System.Linq;

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

using System.Linq;

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

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

...