【问题标题】:Why this private method does get executed from another class?为什么这个私有方法确实从另一个类执行?
【发布时间】:2015-08-17 15:10:10
【问题描述】:

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

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();
    }
}

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

打印方法是私有的

调用的打印方法

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

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

【问题讨论】:

    标签: c# private


    【解决方案1】:

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

    嗯,它只是某种私有的。它使用explicit interface implementation - 它可以通过界面访问,但只能通过界面访问。所以即使在 C 类中,如果你有:

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

    编译失败,但是

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

    ...这在任何地方都可以使用,因为接口是公开的。

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

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

    【讨论】:

    • 那么这是否意味着可访问性限制仅适用于对象的引用而不适用于运行时实例?
    • @JenishRabadiya 不,这意味着您可以将实现整个接口的对象强制转换为该接口并访问不是该私有成员的对象:D
    • @JenishRabadiya:不知道你的意思......但显式接口实现“有点奇怪” - 我会引用一些规范。
    • @JenishRabadiya 我想你的下一个问题可能是“好吧,为什么你想这样做?”。在这种情况下:stackoverflow.com/questions/4103300/…
    • 附带说明,还有更奇怪的可访问性规则:stackoverflow.com/questions/22856215/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多