Compilerfehler CS1540Compiler Error 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.Cannot access protected member 'member' via a qualifier of type 'type1'; the qualifier must be of type 'type2' (or derived from it)

Eine abgeleitete class kann nicht auf geschützte Member der Basisklasse durch eine Instanz der Basisklasse zugreifen.A derived class cannot access protected members of its base class through an instance of the base class. 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.An instance of the base class declared in the derived class might, at run time, be an instance of another type that is derived from the same base but is not otherwise related to the derived class. 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.Because protected members can be accessed only by derived types, any attempts to access protected members that might not be valid at run time are marked by the compiler as not valid.

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.In the Employee class in the following example, emp2 and emp3 both have type Person at compile time, but emp2 has type Manager at run time. Da Employee nicht von Manager abgeleitet ist, kann es nicht auf geschützte Member der Basisklasse, Person, durch eine Instanz der Klasse Manager zugreifen.Because Employee is not derived from Manager, it cannot access the protected members of the base class, Person, through an instance of the Manager class. Der Compiler kann nicht feststellen, was der Laufzeittyp der beiden Person-Objekte sein wird.The compiler cannot determine what the run-time type of the two Person objects will be. Daher erzeugen sowohl der Aufruf von emp2 als auch von emp3 den Compilerfehler CS1540.Therefore, both the call from emp2 and the call from emp3 cause compiler error 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 auchSee Also

VererbungInheritance
PolymorphismusPolymorphism
ZugriffsmodifiziererAccess Modifiers
Abstrakte und versiegelte Klassen und KlassenmemberAbstract and Sealed Classes and Class Members