Я не могу получить доступ к свойству Count массива, но через приведение к ICollection!
-
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:)