[c#] Почему (на самом деле?) Список <T> реализует все эти интерфейсы, а не только IList <T>?



Answers

Неоригинальные интерфейсы предназначены для обратной совместимости. Если вы пишете код с использованием дженериков и хотите передать свой список на какой-либо модуль, написанный на .NET 1.0 (у которого нет дженериков), вы все равно хотите, чтобы это было успешным. Следовательно, IList, ICollection, IEnumerable .

Question

Объявление List из MSDN:

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

Отражатель дает аналогичную картину. Действительно ли List реализует все эти (если да, почему)? Я проверил:

    interface I1 {}
    interface I2 : I1 {}
    interface I3 : I2 {}

    class A : I3 {}
    class B : I3, I2, I1 {}

    static void Main(string[] args)
    {
        var a = new A();
        var a1 = (I1)a;
        var a2 = (I2)a;
        var a3 = (I3)a;

        var b = new B();
        var b1 = (I1) b;
        var b2 = (I2)b;
        var b3 = (I3)b;
    }

он компилируется.

[ОБНОВЛЕНО]:

Ребята, как я понимаю, все ответы остаются, что он:

class Program
{

    interface I1 {}
    interface I2 : I1 {}
    interface I3 : I2 {}

    class A : I3 {}
    class B : I3, I2, I1 {}

    static void I1M(I1 i1) {}
    static void I2M(I2 i2) {}
    static void I3M(I3 i3) {}

    static void Main(string[] args)
    {
        var a = new A();
        I1M(a);
        I2M(a);
        I3M(a);

        var b = new B();
        I1M(b);
        I2M(b);
        I3M(b);

        Console.ReadLine();
    }
}

будет давать ошибку, но она компилируется и запускается без каких-либо ошибок. Зачем?




  1. Да, они делают, потому что List<T> может иметь свойства и метод для выполнения всех этих интерфейсов. Вы не знаете, какой интерфейс кто-то будет объявлять как параметр или возвращаемое значение, поэтому, чем больше пакетов интерфейсов реализуется, тем более универсальным он может быть.
  2. Ваш код будет скомпилирован, потому что upcasting ( var a1 = (I1)a; ) не работает во время выполнения, а не время компиляции. Я могу сделать var a1 = (int)a и скомпилировать его.



Related



Tags

c# c#   .net .net