【发布时间】:2020-04-11 08:39:06
【问题描述】:
根据https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods 可以使用以下语法显式调用接口基实现。
base(IInterfaceType).Method();
但这似乎还没有实现。
是否有解决方法(例如反射)来实现这一点?
说明问题的示例代码
interface IA
{
void M()
{
Console.WriteLine("IA.M");
}
}
interface IB : IA
{
void IA.M()
{
Console.WriteLine("IB.M");
}
}
interface IC : IA
{
void IA.M()
{
Console.WriteLine("IC.M");
}
}
class D : IA, IB, IC
{
public void M()
{
// base(IB).M(); Is not yet supported apparently
((IB)this).M(); // Throws stack overflow
}
}
class Program
{
static void Main(string[] args)
{
D d = new D();
d.M();
}
}
【问题讨论】:
-
您链接到一个提案文档。在 C# 8 中,不能调用基本方法句点。 ` ((IB)this).M();` 是显式调用语法,用于调用方法的实际实现,因此预计会出现堆栈溢出。本质上,这是一个
M(){ M();} -
这不是 C# 8 中“尚未实现”的问题。因为这个版本是最终版本。基础调用可能出现在以后的版本中。
-
不,没有解决方法(不依赖编译器内部,也就是说,我不会认为这是一个有效的解决方法)。这显然是需要的,它最初计划成为 C# 8 的一部分,但事实证明它过于雄心勃勃。该提案计划在 C# 9 中实现,但可能会发生变化。在那之前,除非使方法在其他名称/不同范围内可用,否则无法做到这一点。
-
您为什么还要寻找基本调用?可能还有其他方法可以做任何你想做的事情
标签: c# reflection .net-core c#-8.0