【发布时间】:2023-04-10 19:45:01
【问题描述】:
所以我朋友说显式实现的接口方法是私有的。
考虑这个参数的例子:
interface ITest
{
void Test();
}
class Test : ITest
{
// IS THIS METHOD PRIVATE?
void ITest.Test()
{
Console.WriteLine("What am I?");
}
}
我不相信,我会列出双方的论点:
他:
- You cannot specify any access modifiers on an explicitly implemented method 和 if no access modifier is specified, it will use the lowest possible which should be private 因此该方法是私有的。
- 在this interview at around 30:30 中,听起来他们说显式实现的方法可以是私有的,我确实相信(我的意思是它是 Mads Torgensen),但我不知道为什么会这样。
我:
- 您不能从类内部访问
Test方法,除非您将自己转换为ITest(这是显式实现的方法的工作方式,但如果确实如此,您是否应该能够从类内部调用该方法该类中的私有方法?) - 当您将
Test-instance 转换为ITest时,Test方法变为公开可用并且可以从任何地方调用,因此它不能是私有的。 - 我不知道这有多可信,但在this answer 中声明“显式实现的接口成员”是公开的。
我认为我们都知道显式接口实现的工作原理以及如何使用它,但在这里我们不确定谁是对的。
这个问题真的可以归结为:
你能把Test类中的Test方法称为“私有方法”吗?
【问题讨论】:
-
它具有
private访问级别 -
@DmitryBychenko 有没有办法通过某些规范或通过 IL 来支持它?
-
language spec 圆滑地说:“显式接口成员实现与其他成员具有不同的可访问性特征。因为在方法调用或属性访问中,显式接口成员实现永远无法通过其完全限定名称访问,它们在某种意义上是私有的。但是,由于它们可以通过接口实例访问,它们在某种意义上也是公共的。”不过,就 IL 而言,它们是私有的。
-
好吧,我想我当时是不对的 :) @JeroenMostert 我认为如果你愿意的话,这个评论可能值得作为答案。