Por que não consigo chamar um método de extensão de uma classe base do tipo estendido?
Estou tentando adicionar a capacidade de procurar elementos em umList<KeyValuePair<string,int>>
substituindo o indexador.
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;
}
}
}
}
F, ou por algum motivo, o compilador está lançando este erro:
'System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string,int>>
'não contém uma definição para'Single
'
Embora seja verdade queList<T>
não possui esse método, ele deve estar visível porque é um método de extensão doSystem.Linq
namespace (que está incluído). Obviamente usandothis.Single
resolve o problema, mas por que o acesso viabase
um erro?
A seção 7.6.8 da especificação C # diz
Quandobase.I
ocorre em uma classe ou estrutura,I
deve denotar um membro da classe base dessa classe ou estrutura.
O que pode impedir o acesso ao método de extensão viabase
. No entanto, também diz
No momento da ligação, expressões de acesso à base do formuláriobase.I
ebase[E]
são avaliados exatamente como se fossem escritos((B)this).I
e((B)this)[E]
, OndeB
é a classe base da classe ou estrutura na qual a construção ocorre. Portanto,base.I
ebase[E]
Corresponde athis.I
ethis[E]
, excetothis
é visualizado como uma instância da classe base.
E sebase.I
é como((B)this).I
parece que métodos de extensão devem ser permitidos aqui.
Alguém pode explicar a aparente contradição nessas duas declarações?