Почему List <T>явно не реализует IReadOnlyList <T>? - PullRequest
0 голосов
/ 03 сентября 2018

Я спрашиваю, потому что я думал, что C # требует, чтобы все интерфейсы были реализованы в классе. Используя ILSpy, я обнаружил, что реализации индексатора IReadOnlyList.this [int index] нет в классе List.

это отредактированный фрагмент объявления класса (не все в списке)

public class List < T > : IList <T >, IReadOnlyList < T >

List class declaration

IList<T>.this[int index] есть, но не IReadOnlyList<T>.this[int index].

ILSpy search

Просто кажется странным, как это компилируется в первую очередь? Есть ли в .NET Framework какой-то особый соус, позволяющий это сделать?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Чтобы иметь предварительно реализованный тип IReadOnlyCollection или IReadOnlyList, вы можете использовать ReadOnlyCollection. Пожалуйста, посмотрите на этот пример кода:

 public void Test()
    {
        IList<int> myList = new List<int>() { 1, 10, 20 };
        IReadOnlyList<int> myReadOnlyCollection = new ReadOnlyCollection<int>(myList);
        GetElement(myReadOnlyCollection,1);
    }


 private int GetElement(IReadOnlyList<int> list,int index)
    {
        return list[index];
    }

//Output: 10
0 голосов
/ 03 сентября 2018

Я думаю, что используемый вами инструмент вызывает путаницу. Индексатор в списке явно не реализован как реализация IList.

public class List<T> : ICollection<T>, IEnumerable<T>, IEnumerable, IList<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection, IList
{
    (...)
    public T this[int index] { get; set; }

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

    public interface IOne{void MyMethod();}

    public interface ITwo{void MyMethod();}

    public class MyClass: IOne, ITwo
    {
        public void MyMethod()
        {
            Console.WriteLine("Hello!");
        }
    }

    public static void Main()
    {
        new MyClass().MyMethod();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...