Подтвердить что ты не робот

Почему List <T> реализует IList <T>, ICollection <T> и IEnumerable <T>?

Если вы перейдете к определению List<T>, вы увидите следующее:

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>

IList<T> уже наследует как от ICollection<T>, так и от IEnumerable<T>.

Было бы недостаточно, если List<T> реализован только IList<T>?

4b9b3361

Ответ 1

Да, в этом случае не имеет значения. В некоторых случаях это может иметь значение, если вы используете базовый класс, который уже реализует интерфейс, но вы хотите явно его переопределить - но в этом случае нет базового класса (кроме неявного object), и он будет вести себя точно так же.

Вопреки моим воспоминаниям, я не считаю, что существует разница в том, как класс представлен в метаданных, независимо от того, явно ли он объявляет все интерфейсы или нет. Вот пример:

interface IFoo {}
interface IBar : IFoo {}

class FooBar1 : IBar {}
class FooBar2 : IBar, IFoo {}

Оба ildasm и Reflector показывают ту же информацию для FooBar1 и FooBar2... он показывает, что оба из них реализуют IBar и IFoo.

Другими словами, мы не можем определить, действительно ли исходный код для List<T> указывает все интерфейсы или нет. Может быть, так оно и есть, может быть, нет, но это не имеет значения в любом случае.

EDIT: Для полноты я также проверил случаи, когда вы расширяете два интерфейса с другим интерфейсом. В этом случае я не могу найти разницу в метаданных. Я уверен, что я помню некоторую ситуацию, в которой это было очевидно, но я не могу найти его сейчас.

Ответ 2

Да, да. IList<T> сам реализует два других.

В обозревателе объектов отображаются все интерфейсы, которые реализует класс, прямо (IList<T>) или косвенно (ICollection<T>, IEnumerable<T>, через IList<T>).

Ответ 3

Это не так, как это было на самом деле закодировано за кулисами. Это то, что показывают инструменты, такие как Reflector, когда он превращает IL обратно в С#.

Ответ 4

Если вы посмотрели на исходный код:

https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs

Вы можете заметить, что подпись:

public class List<T> : IList<T>, System.Collections.IList, IReadOnlyList<T>

Это может означать только то, что браузер метаданных отменяет для нас иерархию наследования.