C# 为什么这个私有方法会从另一个类执行?

C# 为什么这个私有方法会从另一个类执行?,c#,private,C#,Private,我创建并实现了一个接口,如下所示 public interface IA { void Print(); } public class C : IA { void IA.Print() { Console.WriteLine("Print method invoked"); } } 然后按照主方法执行 public class Program { public static void Main() {

我创建并实现了一个接口,如下所示

public interface IA
{
    void Print();
}

public class C : IA
{
    void IA.Print()
    {
        Console.WriteLine("Print method invoked");
    }
}
然后按照主方法执行

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();
    }
}
我在控制台上得到的结果是:

打印方法是私有的

调用的打印方法

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

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

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

嗯,这只是一种隐私。它正在使用-它可以通过接口访问,但只能通过接口访问。因此,即使在C类中,如果您有:

C c = new C();
c.Print();
这将无法编译,但是

IA c = new C();
c.Print();
。。。这在任何地方都适用,因为接口是公共的

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

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


那么,这是否意味着可访问性限制仅适用于对象的引用,而不适用于运行时实例?@JenishRabadiya否,这意味着您可以将实现整个接口的对象强制转换到该接口,并访问该私有成员以外的对象:D@JenishRabadiya:不知道你的意思。。。但显式接口实现“有点奇怪”-我会引用一些规范。@JenishRabadiya我想你的下一个问题可能是“好吧,你为什么要这么做?”。在这种情况下:作为旁注,还有更奇怪的可访问性规则: