受保护的成员在其自己的类实例中不可访问?

时间:2017-07-09 04:06:54

标签: c# oop inheritance protected

我是C#的新手,我有一个非常奇怪的问题,下面是源代码:

namespace ConsoleApplication1
{
    class Program
    {
        class B
        {
            protected int number = 11;
        }

        class A : B
        {

        }

        static void Main(string[] args)
        {
            A a = new A();
            int testA = a.number; //error inaccessable due to its protection level

            B b = new B();
            int testB = b.number; //error inaccessable due to its protection level
        }
    }
}

我不明白为什么派生类实例不能访问父母的受保护字段?最奇怪的部分是实例b怎么不能访问自己的字段?

1 个答案:

答案 0 :(得分:1)

我不明白为什么派生类实例a无法访问父母的受保护字段? 和最奇怪的部分是实例b如何无法访问自己的字段?

B可以访问自己的字段,您正试图从A& A的外部访问受保护的字段。 B,在Program的Main()方法中。

了解c#访问说明符here

protected关键字仅允许在类和从中继承的类中进行访问。如果要访问类层次结构之外的属性,则必须使用' public'或者'内部' (在同一个程序集中访问)

class Program
{
    class B
    {
        private int privateNumber = 1;

        protected int protectedNumber = 11;

        public int publicNumber = 1;

        public B()
        {
            privateNumber = 1; // Valid! - private to class B
        }
    }

    class A : B
    {
        public A()
        {
            this.privateNumber = 2; // Invalid - private to class B and not accessible in derived class!
            this.protectedNumber = 3; // Valid 
        }
    }

    static void Main(string[] args)
    {
        A a = new A();
        int testA = a.protetedNumber; // Invalid
        testA = a.publicNumber; // Valid since the field is public
    }
}