Какие интерфейсы реализуют все массивы на C #?

Будучи новым программистом .NET 3.5, я начал изучать LINQ, и я нашел кое-что довольно простое, чего я раньше не заметил:

В книге утверждается, что каждый массив реализует IEnumerable (очевидно, в противном случае мы не могли бы использовать LINQ для объектов на массивах …). Когда я увидел это, я подумал, что я никогда об этом не думал, и я спросил себя, что еще реализуют все массивы – поэтому я изучил System.Array используя браузер объектов (поскольку это базовый class для каждого массива в CLR) и, к моему удивлению, он не реализует IEnumerable .

Поэтому мой вопрос: где определение? Я имею в виду, как я могу точно определить, какие интерфейсы реализуют каждый массив?

Из документации (акцент мой):

[…] class Array реализует System.Collections.Generic.IList , System.Collections.Generic.ICollection и System.Collections.Generic.IEnumerable общие интерфейсы. Реализации предоставляются массивам во время выполнения и поэтому не видны инструментам сборки документации.

EDIT: как отмечает Jb Evain в своем комментарии, только векторы (одномерные массивы) реализуют общие интерфейсы. Что касается того, почему многомерные массивы не реализуют общие интерфейсы, я не совсем уверен, так как они реализуют не generic-аналоги (см. Объявление classа ниже).

Класс System.Array (т.е. каждый массив) также реализует эти не общие интерфейсы:

 public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable 

Вы можете найти ответ на свой вопрос эмпирически, используя небольшой fragment кода:

 foreach (var type in (new int[0]).GetType().GetInterfaces()) Console.WriteLine(type); 

Выполнение приведенного выше fragmentа приведет к следующему выводу (на .NET 4.0):

 System.ICloneable System.Collections.IList System.Collections.ICollection System.Collections.IEnumerable System.Collections.IStructuralComparable System.Collections.IStructuralEquatable System.Collections.Generic.IList`1[System.Int32] System.Collections.Generic.ICollection`1[System.Int32] System.Collections.Generic.IEnumerable`1[System.Int32] 

( `1 означает )

Начиная с .NET 4.5, массивы также реализуют интерфейсы System.Collections.Generic.IReadOnlyList и System.Collections.Generic.IReadOnlyCollection .

Таким образом, при использовании .NET 4.5 полный список интерфейсов, реализуемых массивами, становится (получен с использованием метода, представленного в ответе Хосам Али ):

 System.Collections.IList System.Collections.ICollection System.Collections.IEnumerable System.Collections.IStructuralComparable System.Collections.IStructuralEquatable System.Collections.Generic.IList`1[System.Int32] System.Collections.Generic.ICollection`1[System.Int32] System.Collections.Generic.IEnumerable`1[System.Int32] System.Collections.Generic.IReadOnlyList`1[System.Int32] System.Collections.Generic.IReadOnlyCollection`1[System.Int32] 

Как ни странно, кажется, что было забыто обновить документацию на MSDN, чтобы упомянуть эти два интерфейса.

Осторожно на интерфейсах массива, они могут реализовать их, но на самом деле они этого не делают … Возьмите галочку по следующему коду:

  var x = new int[] { 1, 2, 3, 4, 5 }; var y = x as IList; Console.WriteLine("The IList:" + string.Join(",", y)); try { y.RemoveAt(1); } catch (Exception e) { Console.WriteLine(e); } Console.WriteLine(string.Join(",", y)); 

Он производит следующий результат: результат

Таким образом, parsing работает, но не все поддерживается, что является правильным из перспективы фиксированной длины коллекции, но совершенно неправильно, если вы действительно считаете, что это список. Там принцип Лискова от SOLID :(.

Для тестирования быстро это поможет.

Я нашел реализацию IList, ICollection, IEnumerable в вложенном classе SZArrayHelper массива.

Но я должен вас предупредить – там вы найдете гораздо больше вопросов …

Повторение

После этого я получил только один – there_is_no_array;)

  • Java - порядок операций - использование двух операторов присваивания в одной строке
  • Swift, как сортировать массив настраиваемых объектов по значению свойства
  • найти элемент в отсортированной матрице
  • Производительность массивов против списков
  • Примечание. Преобразование массива в строку в
  • Java - лучший способ печати 2D-массива?
  • Работа со списком списков в Java
  • Являются ли массивы C # streamами безопасными?
  • Как создать ArrayList (ArrayList ) из массива (int ) в Java
  • swift: изменение массивов внутри словарей
  • Почему Arrays.asList () возвращает свою собственную реализацию ArrayList
  • Interesting Posts
    Давайте будем гением компьютера.