为什么在C#8中更改了默认接口方法的行为?过去,以下代码(当未发布默认接口方法的演示时):
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();
}
}
具有以下输出:
控制台输出:
我是界面中的默认方法!
我是一个覆盖的默认方法!
但是,使用最新版本的C#8,上面的代码将产生以下输出:
控制台输出:
我是一个覆盖的默认方法!
我是一个覆盖的默认方法!
任何人都可以向我解释为什么这种行为会改变?
注意:
IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();
((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??
2
C#8 之前没有默认的接口方法。第二个输出是预期的情况-实现接口方法时,您希望它被调用。您是在指较旧的规范吗?我希望它被放弃,因为它破坏了接口方法的预期行为
—
Panagiotis Kanavos
更好的问题是“如何调用默认方法而不是具体实现?” 答案是“您还不能,因为base.DefaultMethod()语法已从C#8中删除”
—
Panagiotis Kanavos
这是设计会议页面,讨论了C#8的基本调用
—
Panagiotis Kanavos
Cut base() syntax for C# 8. We intend to bring this back in the next major release.
。这将需要运行时支持才能正常工作。
接口始终是接口。当我实现接口方法时,我希望所有客户端都调用已实现的方法。客户也不必关心哪个类实现了该方法-他们有一个接口并调用它。
—
Panagiotis Kanavos
至于您发布的语法,它必须来自一个非常古老的建议-DIM只能显式调用,就像显式实现的接口一样。该提案虽然使用显式接口语法......做了相反的
—
Panagiotis Kanavos
virtual
我猜?并可能引入继承钻石