实现具有冲突方法签名的接口的类

eca*_*ver 7 c# clr interface

假设我们有两个具有冲突方法签名的接口:

interface IA
{
    void F();
}

interface IB
{
    int F();
}
Run Code Online (Sandbox Code Playgroud)

现在我们创建一个这样的类:

class Test : IA, IB
{
    public void F() { ... }
    int IB.F() { ... }
}
Run Code Online (Sandbox Code Playgroud)

名为的方法IB.F看起来像一个private方法,但是你可以这样做:

var t = new Test();
t.F();       //Calls public method F
((IB)t).F(); //Calls private method IB.F!!!
Run Code Online (Sandbox Code Playgroud)

所以我的问题是: C#编译器如何知道IB.F可以在类范围之外调用?

我猜这是IB.前缀,但查看IL代码,它只是作为一个private奇怪的签名方法出现.

pas*_*ein 9

"private"方法包含以下内容:

.method private hidebysig newslot virtual final instance int32 ns.IB.F() cil managed
{ 
    .override Tests.IB::F
    //...
}
Run Code Online (Sandbox Code Playgroud)

并在IB:

.method public hidebysig newslot abstract virtual instance int32 F() cil managed
{
}
Run Code Online (Sandbox Code Playgroud)

.override告诉编译器看看在声明IB.它说这个方法是public.

实际上没有声明该方法,默​​认情况下private,"nothing"表示public接口方法.

尝试在前面添加任何类型的访问修饰符int IB.F(),这将是编译器错误,因为您可能无法更改显式接口实现的可访问性.