为什么不能在构造函数中设置此只读属性?

时间:2019-05-05 13:41:51

标签: c# properties visibility

我想在构造函数中设置只读属性“ EmployeeList”,但是由于某些原因,它是不允许的,因为EmployeeList是只读的。但是,对于其他只读属性“ Manager”,它也可以正常工作。唯一的区别是我自己为EmployeeList编写了吸气剂,为Manager编写了自动生成的吸气剂。

不允许我使用私人二传手来解决此问题。

class Project
    {
        public Employee Manager { get; }

        public EmployeeList EmployeeList
        {
            //Creates a copy of the EmployeeList and returns it
            get
            {
                //...
                return listCopy;
            }
        }

        //Initializes class-variables.
        public Project(Employee manager, EmployeeList 
                        employeeList)
        {
            Manager = manager;
            EmployeeList = employeeList; //Error: EmployeeList is read-only
        }
}

为什么不能设置EmployeeList以及如何解决呢?

2 个答案:

答案 0 :(得分:2)

您可以在构造函数中设置只读automatically-implemented property,但是在您的情况下,您已经指定了一个实现。当您尝试调用“ setter”时,该编译器不知道该怎么做-它不会遍历getter并注意到您正在返回listCopy变量。 (这甚至可能不是一个字段-我们看不到您的其他getter代码。)

因此,您的选择是:

  • EmployeeList更改为自动实现的属性
  • 直接分配到相关的后勤字段

答案 1 :(得分:1)

EmployeeList是一个属性。它只有get个访问器方法-因此无论如何都无法设置它。另一方面,Manager是只读的自动属性,它等于:

class Project
{
        public readonly Employee _Manager;
        public Employee Manager 
        {
            get { return _Manager; }
        }

        // ...

        //Initializes class-variables.
        public Project(Employee manager, EmployeeList 
                        employeeList)
        {
            _Manager = manager;
            // Manager = manager; //Error: Manageris read-only
        }
}

因此,在设置Manager时,将隐式设置其编译器定义的字段(_Manager in this example),该字段为只读。但是构造器无法设置属性Manager(和EmployeeList)-这是一个属性。