Compilerfehler CS1540

Auf den geschützten Member "Member" kann nicht über einen Qualifizierers vom Typ "Typ1" zugegriffen werden. Der Qualifizierer muss vom Typ "Typ2" (oder von ihm abgeleitet) sein.s

Eine abgeleitete Klasse kann über eine Instanz der Basisklasse nicht auf geschützte Member seiner Basisklasse zugreifen. Eine in der abgeleiteten Klasse deklarierte Instanz der Basisklasse ist zur Laufzeit möglicherweise eine Instanz eines anderen Typs, der von der gleichen Basis abgeleitet ist aber sonst keine Beziehung zur abgeleiteten Klasse aufweist. Da auf geschützte Member nur von abgeleiteten Typen zugegriffen werden kann, werden alle Versuche, auf geschützte Member zuzugreifen, die zur Laufzeit möglicherweise ungültig sind, vom Compiler als ungültig markiert.

In der Employee-Klasse im folgenden Beispiel, weisen emp2 und emp3 zur Kompilierzeit beide den Person-Typ auf, aber emp2 verfügt zur Laufzeit über den Manager-Typ. Da Employee nicht von Manager abgeleitet ist, kann es nicht über eine Instanz der Manager-Klasse auf die geschützten Member der Basisklasse (Person) zugreifen. Der Compiler kann den Laufzeittyp der zwei Person-Objekte nicht feststellen. Daher verursacht sowohl der Aufruf von emp2 als auch von emp3 den Compilerfehler CS1540.

using System;
using System.Text;

namespace CS1540
{
    class Program1
    {
        static void Main()
        {
            Employee.PreparePayroll();
        }
    }

    class Person
    {
        protected virtual void CalculatePay() 
        {
            Console.WriteLine("CalculatePay in Person class.");
        }
    }

    class Manager : Person
    {
        protected override void CalculatePay() 
        {
            Console.WriteLine("CalculatePay in Manager class."); 
        
        }
    }

    class Employee : Person
    {
        public static void PreparePayroll()
        {
            Employee emp1 = new Employee();
            Person emp2 = new Manager();
            Person emp3 = new Employee();
            // The following line calls the method in the Employee base class,
            // Person.
            emp1.CalculatePay(); 

            // The following lines cause compiler error CS1540. The compiler 
            // cannot determine at compile time what the run-time types of 
            // emp2 and emp3 will be.
            //emp2.CalculatePay(); 
            //emp3.CalculatePay();
 
        }
    }
}

Siehe auch

Referenz

Vererbung (C#-Programmierhandbuch)

Polymorphismus (C#-Programmierhandbuch)

Zugriffsmodifizierer (C#-Programmierhandbuch)

Abstrakte und versiegelte Klassen und Klassenmember (C#-Programmierhandbuch)