Почему я не могу вызвать метод расширения из базового класса расширенного типа?
Я пытаюсь добавить возможность поиска элементов вList<KeyValuePair<string,int>>
переопределив индексатор.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
public class MyList : List<KeyValuePair<string, int>>
{
public int this[string key]
{
get
{
return base.Single(item => item.Key == key).Value;
}
}
}
}
По какой-то причине компилятор выдает эту ошибку:
'System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string,int>>
«не содержит определения для»Single
».
Хотя это правда, чтоList<T>
не имеет этот метод, он должен быть видимым, потому что это метод расширения изSystem.Linq
пространство имен (которое входит в комплект). Очевидно, используяthis.Single
решает проблему, но почему доступ черезbase
ошибка?
Раздел 7.6.8 спецификации C # говорит
когдаbase.I
происходит в классе или структуре,I
должен обозначать член базового класса этого класса или структуры.
Что может показаться препятствующим доступу к методу расширения черезbase
, Однако это также говорит
Во время привязки выражения базового доступа видаbase.I
а такжеbase[E]
оцениваются точно так же, как если бы они были написаны((B)this).I
а также((B)this)[E]
, гдеB
является базовым классом класса или структуры, в которой встречается конструкция. Таким образом,base.I
а такжеbase[E]
соответствоватьthis.I
а такжеthis[E]
, Кромеthis
рассматривается как экземпляр базового класса.
Еслиbase.I
это как((B)this).I
тогда кажется, что методы расширения должны быть разрешены здесь.
Может ли кто-нибудь объяснить очевидное противоречие в этих двух утверждениях?