Я пытаюсь добавить возможность поиска элементов в 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 спецификации С# указано
Когда
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, то кажется, что методы расширения должны быть разрешены здесь.
Может ли кто-нибудь объяснить очевидное противоречие в этих двух утверждениях?

