Ich versuche zu verstehen, wie Einschränkungen (auf Klasse oder generische Methoden) die Methoden selbst beeinflussen können. Nehmen Sie diesen Code zum Beispiel:Constraints für überschriebene generische Methoden
class Base<T> where T:class, IComparable<T>
{
public virtual void Method(T obj) { }
}
class Derived<T> : Base<T> where T:class, IComparable<T>, IEnumerable<T>
{
public override void Method(T obj) { }
}
Dieser Code kompiliert fein und die Compiler/Laufzeit ist in der Lage polymorphe Anrufe an die nicht-generische Methode ‚Methode‘ zu lösen, die einen Parameter annimmt, die generischen Typ ist. In der Basisklasse und der abgeleiteten Klasse sind die Einschränkungen für den Parameter type unterschiedlich.
Ich habe auch eine Klassenbeschränkung angegeben, um Werttypen auszuschließen, die möglicherweise ein Problem verursachen, da für jede Instanziierung vom Werttyp eine andere Klasse generiert wird, während nur eine solche Klasse für Referenztypen instanziiert wird.
Auf der anderen Seite kompiliert der folgende Code nicht.
class Base
{
public virtual void Method<T>() where T : class, IComparable<T> { }
}
class Derived : Base
{
public override void Method<T>() where T : class, IComparable<T>, IEnumerable<T> { }
}
Die Sprachspezifikation für C# sagt, dass die Beschränkungen für eine generische Methode, werden wie es an eine übergeordnete Methode ist und dass es illegal ist keine Beschränkungen als solche zu spezifizieren. Ich habe bei Google nach etwas gesucht und herausgefunden, dass dies aufgrund der Komplexität, die mit der Unterstützung von polymorphen Aufrufen verbunden ist (im Hinblick auf die Pflege einer Methodentabelle usw.), nicht erlaubt ist. Aber ich verstehe immer noch nicht, warum es im obigen Fall 1 ähnlich ist, außer dass es die Klasse ist, die generisch ist. Wie kann der Compiler/Runtime dies in Fall 1 tun, während Fall 2 als Compilerfehler gekennzeichnet ist?
Fall 1 Sie haben Basisklasse und dervied beide Generika –
@EhsanSajjad - so? Im ersten Fall ist es die Klasse, die generisch ist, während es im zweiten Fall die Methode ist. Wenn Sie keine Klassenbeschränkung angeben, beschränken Sie die Instanziierungen auf nur eine? also warum ist man nicht erlaubt, während der andere gut funktioniert? – Madhusudhan