Export (0) Print
Expand All
Expand Minimize
This topic has not yet been rated - Rate this topic

Compiler Error CS1540

Cannot access protected member 'member' via a qualifier of type 'type1'; the qualifier must be of type 'type2' (or derived from it)

A derived class cannot access protected members of its base class through an instance of the base class. 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. 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 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. 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. The compiler cannot determine what the run-time type of the two Person objects will be. 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();
 
        }
    }
}
Show:
© 2014 Microsoft. All rights reserved.