为什么这里还是要报错呢

时间:2021-12-11 07:39:49

转自(https://www.cnblogs.com/wangyt223/archive/2012/08/08/2627801.html)

在c#的可访谒性级别中,public和private算是最容易理解的,,相反protected往往令人非常头疼。经常在网上查资料的伴侣往往会发明,
答案几乎都是前篇一律,不是从msdn上拷贝的就是从别人的博客上剽窃的,的确是天下文章一大抄,今天咱们就来点和别人差此外,通过例子来透析一下
protected访谒修饰符到底是怎么回事。 

    
下面先来看一下,protected访谒修饰符在大大都资猜中的界说:访谒仅限于包罗类或从包罗类派生的类型。搞大白问题只靠眼看是不行的,需要实践,现
在我们用事实来说明问题。

代码如下:

class BaseTest

    {

        public int a = 10;

        protected int b = 2;

    }



    class ChildTest:BaseTest

    {

        int c;

        int d;



        public void printTest()

        {

            BaseTest basetest = new BaseTest();

            this.a=basetest.a;

            this.c = basetest.b;

        }

    }

    
这段代码中派生类中的要领的最后一行代码会报错:无法通过类型“protectedtest.Vehicle”的限定符访谒掩护成员
“protectedtest.Vehicle.weight”;限定符必需是类型“protectedtest.Car”(或者从该类型派生)。看到这
里就会有很多人要问了,不是说protected类型的访谒仅限于包罗类或者从包罗类派生的类型吗,为什么这里还是要报错呢,下面就来说明一下,包罗类能
够使用protected类型的应该是没有任何问题了,这里就不用阿谁说了,主要问题就是集中在为什么在上面的阿谁例子中基类的实例为什么不能够访谒
protected类型的变量,这里就涉及到对protected类型的理解,protected类型并不是能够被派生类所访谒就是随心所欲的访谒,而是
有条件的,访谒必需是通过派生类类型产生时,在派生类中的基类的protected类型成员才华够被访谒,这里就很清楚了上面的代码并不是通过派生类的类
型访谒的,而是通过基类的类型访谒的,此时而今,protected和private十分的相似,只不过,protected类型成员能够被派生类所担任
并且能够通过派生类类型访谒罢了。

    改成如下形式就正确了,不过大家不过拘泥于这两个代码的形式,要看透到底是说明了个什么问题.

class BaseTest

        {

            public int a = 10;

            protected int b = 2;

        }



        class ChildTest : BaseTest

        {

            int c;

            int d;



            static void Main(string[] args)

            {

                BaseTest basetest = new BaseTest();

                ChildTest childTest = new ChildTest();

                Console.WriteLine(childTest.b);

            }

        }