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