Ich nehme an, dass sie sich auf die Tatsache beziehen, dass der C# -Compiler die Methode wählt, die den Typ am engsten definiert. So zum Beispiel, wenn Sie eine abstrakte Klasse (ABS) und eine vererbte Klasse (CLS2) und 2 Erweiterungsmethoden
public static object GetStuff(this ABS obj){
blah blah blah
}
public static object GetStuff(this CLS obj){
blah blah blah
}
, wenn Sie die CLS2.GetStuff() aufrufen, wird der Compiler die zweite Methode wählen. Sobald Sie wissen, dass Sie eine Erweiterungsmethode "überschreiben" können, indem Sie sie spezifischer machen. Also, wenn Sie eine generische Klasse haben
public class Foo<T>{}
Sie 2 Erweiterungsmethoden machen könnten (unter Verwendung von Klassen von oben als Typ)
public static void DoSomething(this Foo<Abs> abs){}
und
public static void DoSomething(this Foo<CLS2> abs){}
Hier ist die zweite Methode „Übergeordnete "der mehr" generische "abstrakte Typ.
Dies ist nur möglich mit C#, weil es tatsächlich eine neue Klasse für jeden generischen Typ generiert. Bei einer Sprache wie Java, in der "Type Erasure Generics" verwendet wird, kann man die generische Methode nicht "überladen", da alles wirklich Typ Object unter der Haube ist.
Warum fragst du das Originalplakat nicht nach dieser Frage oder fragst nach Klärung. – GreatAndPowerfulOz
Für welchen Teil der Frage suchen Sie eine Klarstellung? Würden Sie gerne klären, welche C# -Erweiterungen, wie sie verwendet werden oder wie sie den Haskell-Typen ähnlich sind? –
Ich bin mit Erweiterungsmethoden vertraut. Ich verstehe das übergeordnete Ding nicht, das auf "der Instanziierung der generischen Parameter" basiert. Das ist mein zentrales Thema. Wenn ein Vergleich zu Haskells Typenklassen helfen kann, das Konzept zu erklären, würde ich es begrüßen. – Olaf