假设我们有两个具有冲突方法签名的接口:
interface IA
{
void F();
}
interface IB
{
int F();
}
现在我们创建一个这样的类:
class Test : IA,IB
{
public void F() { ... }
int IB.F() { ... }
}
名为IB.F的方法看起来像一个私有方法,但是你可以这样做:
var t = new test(); t.F(); //Calls public method F ((IB)t).F(); //Calls private method IB.F!!!
所以我的问题是:C#编译器如何知道可以在类范围之外调用IB.F?
我想这就是IB.前缀,但查看IL代码,它只是作为一个私人方法出现与奇怪的签名.
解决方法
“private”方法包含以下内容:
.method private hidebysig newslot virtual final instance int32 ns.IB.F() cil managed
{
.override Tests.IB::F
//...
}
在IB中:
.method public hidebysig newslot abstract virtual instance int32 F() cil managed
{
}
.override告诉编译器查看IB中的声明.它说这个方法是公开的.
该方法实际上并未声明为私有,默认情况下,“nothing”表示接口方法是public.
尝试在int IB.F()前面添加任何类型的访问修饰符,这将是编译器错误,因为您可能无法更改显式接口实现的可访问性.