为什么要从另一个类执行这个私有方法

本文关键字:有方法 执行 另一个 为什么 | 更新日期: 2023-09-27 17:52:52

我像下面这样显式地创建并实现了一个接口。

public interface IA
{
    void Print();
}
public class C : IA
{
    void IA.Print()
    {
        Console.WriteLine("Print method invoked");
    }
}

然后在Main方法

之后执行
public class Program
{
    public static void Main()
    {
        IA c = new C();
        C c1 = new C();
        foreach (var methodInfo in c.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance))
        {
            if (methodInfo.Name == "ConsoleApplication1.IA.Print")
            {
                if (methodInfo.IsPrivate)
                {
                    Console.WriteLine("Print method is private");
                }
            }
        }
        
        c.Print();
    }
}

,我在控制台上得到的结果是:

打印方法是私有的

打印方法调用

所以我的问题是为什么这个私有方法从其他类执行?

据我所知,private成员的可访问性仅限于其声明类型,那么为什么它的行为如此奇怪呢?

为什么要从另一个类执行这个私有方法

所以我的问题是为什么这个私有方法从其他类执行?

只是有点私有。它使用显式接口实现——它可以通过接口访问,但只能通过接口访问。所以即使在C类中,如果你有:

C c = new C();
c.Print();

会编译失败,但是

IA c = new C();
c.Print();

…这在任何地方都可以工作,因为接口是公共的。

c#规范(13.4.1)指出,显式接口实现在访问方面是不寻常的:

显式接口成员实现与其他成员具有不同的可访问性特征。由于显式接口成员实现在方法调用或属性访问中永远无法通过其完全限定名进行访问,因此它们在某种意义上是私有的。但是,由于它们可以通过接口实例访问,因此在某种意义上它们也是公共的。