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

1
        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   ответа
3

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

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

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

1

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

using System.Linq;

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

using System.Linq;

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

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

@Marc: Ах, узнал что-то новое сегодня.
@VVS - вы не правы. Enumerable.Count () проверяет ICollection & lt; T & gt ;, используя .Count для внутреннего использования.
.. который будет O (n) вместо O (1)
6

Но это доступно (какexplicit interface implementation) на 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

Похожие вопросы