Erreur du compilateur CS1540

Impossible d’accéder au membre protégé 'member' par l’intermédiaire d’un qualificateur de type 'type1' ; le qualificateur doit être de type 'type2' (ou dérivé de celui-ci)

Une classe dérivée ne peut pas accéder aux membres protégés de sa classe de base via une instance de la classe de base. Une instance de la classe de base déclarée dans la classe dérivée peut, au moment de l’exécution, être une instance d’un autre type dérivé de la même base mais qui ne possède pas d’autres liens avec la classe dérivée. Dans la mesure où seuls les types dérivés peuvent accéder aux membres protégés, toute tentative d’accès aux membres protégés susceptible de ne pas être valide au moment de l’exécution est marquée par le compilateur comme non valide.

Dans la classe Employee de l’exemple suivant, emp2 et emp3 ont le type Person au moment de la compilation, mais emp2 a le type Manager au moment de l’exécution. Comme Employee n’est pas dérivé de Manager, il ne peut pas accéder aux membres protégés de la classe de base, Person, via une instance de la classe Manager. Le compilateur ne peut pas déterminer ce que le type d’exécution des deux objets Person sera. Par conséquent, l’appel d’emp2 et l’appel d’emp3 provoquent tous deux l’erreur du compilateur 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();  
  
        }  
    }  
}  

Voir aussi