Warum wird das Verhalten der Standardschnittstellenmethoden in C # 8 geändert? In der Vergangenheit der folgende Code (als die Standardschnittstellenmethoden Demo nicht veröffentlicht wurden):
interface IDefaultInterfaceMethod
{
// By default, this method will be virtual, and the virtual keyword can be here used!
virtual void DefaultMethod()
{
Console.WriteLine("I am a default method in the interface!");
}
}
interface IOverrideDefaultInterfaceMethod : IDefaultInterfaceMethod
{
void IDefaultInterfaceMethod.DefaultMethod()
{
Console.WriteLine("I am an overridden default method!");
}
}
class AnyClass : IDefaultInterfaceMethod, IOverrideDefaultInterfaceMethod
{
}
class Program
{
static void Main()
{
IDefaultInterfaceMethod anyClass = new AnyClass();
anyClass.DefaultMethod();
IOverrideDefaultInterfaceMethod anyClassOverridden = new AnyClass();
anyClassOverridden.DefaultMethod();
}
}
hat folgende Ausgabe:
Konsolenausgabe:
Ich bin eine Standardmethode in der Schnittstelle!
Ich bin eine überschriebene Standardmethode!
Mit der letzten Version von C # 8 erzeugt der obige Code jedoch die folgende Ausgabe:
Konsolenausgabe:
Ich bin eine überschriebene Standardmethode!
Ich bin eine überschriebene Standardmethode!
Kann mir jemand erklären, warum sich dieses Verhalten ändert?
Hinweis:
IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();
((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??
c#
c#-8.0
default-interface-member
Bassam Alugili
quelle
quelle
Cut base() syntax for C# 8. We intend to bring this back in the next major release.
. Dies würde Laufzeitunterstützung erfordern, um richtig zu funktionieren.virtual
Ich denke? Und möglicherweise einen Erbschaftsdiamanten einführenAntworten:
Ich vermute, eine bessere Frage wäre:
Das Feature war geplant, wurde jedoch im April 2019 von C # 8 gestrichen , da für eine effiziente Implementierung Unterstützung zur Laufzeit erforderlich wäre. Dies konnte nicht rechtzeitig vor der Veröffentlichung hinzugefügt werden. Die Funktion müsste sowohl für C # als auch für VB.NET gut funktionieren - F # mag sowieso keine Schnittstellen.
Es funktioniert über einen
base()
Aufruf , der der Funktionsweise von Klassen ähnelt. Kopieren des Beispielvorschlags:quelle
Why would you do that?
. Dann fand ich das Sitzungsprotokoll heraus