Compilerfehler CS1540

Auf den geschützten Member „member“ kann nicht über einen Qualifizierer vom Typ „type1“ zugegriffen werden. Der Qualifizierer muss vom Typ „type2“ (oder von ihm abgeleitet) sein.

Eine abgeleitete class kann nicht auf geschützte Member der Basisklasse durch eine Instanz der Basisklasse zugreifen. Eine Instanz der Basisklasse, die in der abgeleiteten Klasse deklariert wurde, kann zur Laufzeit eine Instanz eines anderen Typs sein, der von der gleichen Basisklasse abgeleitet ist, aber andernfalls nicht auf die abgeleitete Klasse bezogen werden kann. 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 nicht gültig sind, vom Compiler als ungültig markiert.

In der Employee-Klasse im folgenden Beispiel verfügen emp2 und emp3 jeweils über Typ Person zur Kompilierzeit, jedoch weist emp2 den Typ Manager zur Laufzeit auf. Da Employee nicht von Manager abgeleitet ist, kann es nicht auf geschützte Member der Basisklasse, Person, durch eine Instanz der Klasse Manager zugreifen. Der Compiler kann nicht feststellen, was der Laufzeittyp der beiden Person-Objekte sein wird. Daher erzeugen 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

Vererbung
Polymorphismus
Zugriffsmodifizierer
Abstrakte und versiegelte Klassen und Klassenmember