¿Por qué no puedo llamar a un método de extensión desde una clase base del tipo extendido?
Estoy tratando de agregar la capacidad de buscar elementos en unList<KeyValuePair<string,int>>
anulando el 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, o alguna razón, el compilador arroja este error:
'System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string,int>>
'no contiene una definición para'Single
'.
Si bien es cierto queList<T>
no tiene ese método, debería ser visible porque es un método de extensión delSystem.Linq
espacio de nombres (que está incluido). Obviamente usandothis.Single
resuelve el problema, pero ¿por qué es el acceso a través debase
¿un error?
La sección 7.6.8 de la especificación de C # dice
Cuandobase.I
ocurre en una clase o estructura,I
debe denotar un miembro de la clase base de esa clase o estructura.
Lo que parece impedir el acceso al método de extensión a través debase
. Sin embargo también dice
En tiempo de enlace, expresiones de acceso base del formulariobase.I
ybase[E]
son evaluados exactamente como si estuvieran escritos((B)this).I
y((B)this)[E]
, dóndeB
es la clase base de la clase o estructura en la que ocurre la construcción. Así,base.I
ybase[E]
corresponden a lasthis.I
ythis[E]
exceptothis
se ve como una instancia de la clase base.
Sibase.I
es como((B)this).I
entonces parece que los métodos de extensión deberían permitirse aquí.
¿Alguien puede explicar la aparente contradicción en estas dos declaraciones?