假设我们有两个方法签名冲突的接口(interface):
interface IA
{
void F();
}
interface IB
{
int F();
}
现在我们创建一个这样的类:
class Test : IA, IB
{
public void F() { ... }
int IB.F() { ... }
}
名为IB.F
的方法看起来像一个private
方法,但是您可以这样做:
var t = new Test();
t.F(); //Calls public method F
((IB)t).F(); //Calls private method IB.F!!!
所以我的问题是:C# 编译器如何知道 IB.F
可以在类作用域外调用?
我猜是 IB.
前缀,但查看了 IL
代码,它只是作为一个带有奇怪签名的 private
方法出现.
最佳答案
“私有(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
中的声明。那里说该方法是public
。
该方法实际上并没有被声明为private
,“nothing”意味着接口(interface)方法默认为public
。
尝试在 int IB.F()
前添加任何类型的访问修饰符,这将是编译器错误,因为您可能无法更改显式接口(interface)实现的可访问性。
关于c# - 类实现具有冲突方法签名的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16863767/