Perché il comportamento dei metodi di interfaccia predefiniti è cambiato in C # 8? In passato il seguente codice (quando non sono stati rilasciati i metodi dell'interfaccia predefinita):
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();
}
}
ha il seguente output:
Uscita console:
Sono un metodo predefinito nell'interfaccia!
Sono un metodo predefinito ignorato!
Ma con l'ultima versione di C # 8 il codice sopra sta producendo il seguente output:
Uscita console:
Sono un metodo predefinito ignorato!
Sono un metodo predefinito ignorato!
Qualcuno può spiegarmi perché questo comportamento è cambiato?
Nota:
IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();
((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??
Cut base() syntax for C# 8. We intend to bring this back in the next major release.
. Ciò richiederebbe il supporto del runtime per funzionare correttamente.
virtual
immagino? E forse introducendo un diamante ereditario