c# - 类实现具有冲突方法签名的接口(interface)

标签 c# interface clr

假设我们有两个方法签名冲突的接口(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/

相关文章:

c# - "as"和可空类型的性能惊喜

c# - MySqlCommand.LastInsertedId 是如何工作的?

C++多菱形继承和纯虚函数

c# - Excel图表+C#

c++ - 如何在 C++ 中实现自定义标准集合?

c# - 如何重载/替换/扩展公共(public)代码中使用的 C# 接口(interface)

c# - 从 C# CLR 快速插入

c# - WeakReference 在 Debug 和 Release 中表现不同(没有附加调试器)。即使使用工厂方法

c# - 如何解决有关将 Moq 与 IDataReader 一起使用的问题

c# - "mysqli_fetch_array"是否有等效的 C# 函数?