加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:06:45 所属栏目:百科 来源:网络整理
导读:假设我们有两个具有冲突方法签名的接口: interface IA{ void F();}interface IB{ int F();} 现在我们创建一个这样的类: class Test : IA,IB{ public void F() { ... } int IB.F() { ... }} 名为IB.F的方法看起来像一个私有方法,但是你可以这样做: var t =
假设我们有两个具有冲突方法签名的接口:
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()前面添加任何类型的访问修饰符,这将是编译器错误,因为您可能无法更改显式接口实现的可访问性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读