Warum kann ich keine Erweiterungsmethode von einer Basisklasse des erweiterten Typs aufrufen?
Ich versuche, die Fähigkeit zum Nachschlagen von Elementen in einem @ hinzuzufügeList<KeyValuePair<string,int>>
durch Überschreiben des Indexers.
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 oder aus irgendeinem Grund gibt der Compiler diesen Fehler aus:
'System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string,int>>
'enthält keine Definition für'Single
'.
Während es wahr ist, dassList<T>
hat diese Methode nicht, sie sollte sichtbar sein, da es sich um eine Erweiterungsmethode aus dem @ handelSystem.Linq
Namespace (der enthalten ist). Offensichtlich mitthis.Single
behebt das Problem, aber warum ist der Zugriff überbase
ein Fehler
Abschnitt 7.6.8 der C # -Spezifikation sagt
Wannbase.I
kommt in einer Klasse oder Struktur vor,I
muss ein Mitglied der Basisklasse dieser Klasse oder Struktur bezeichnen.
Was den Zugriff auf die Erweiterungsmethode über @ anscheinend ausschliebase
. Es steht aber auch
Zur Bindungszeit Base-Access-Ausdrücke des Formularsbase.I
undbase[E]
werden genau so ausgewertet, als ob sie geschrieben wären((B)this).I
und((B)this)[E]
, woB
ist die Basisklasse der Klasse oder Struktur, in der das Konstrukt vorkommt. Also,base.I
undbase[E]
entsprichtthis.I
undthis[E]
, außerthis
wird als Instanz der Basisklasse angesehen.
Wennbase.I
ist genau wie((B)this).I
dann sollten hier anscheinend Erweiterungsmethoden erlaubt sein.
ann jemand den offensichtlichen Widerspruch in diesen beiden Aussagen erkläre