为什么我可以将初始化器语法与readonly属性一起使用

Rac*_*hel 4 c#

我有一个Manager有两个属性的类,如下所示:

public class Manager()
{
  private string _name;
  private List<int> _reportingEmployeesIds;
  public string Name { get { return _name; }}
  public List<int> ReportingEmployeesIds { get {return _reportingEmployeesIds; } }  
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建Manager类的实例,如下所示

Manager m = new Manager 
{  
   Name = "Dave", // error, expected
   ReportingEmployeesIds = {2345, 432, 521} // no compile error - why?
};
Run Code Online (Sandbox Code Playgroud)

两个属性都缺少set属性,但编译器允许设置ReportingEmployeesIds,但不允许设置Name属性(错误:属性或索引器Manager.Name不能分配给它,它只是readonly).

为什么会这样?为什么编译器不会抱怨ReportingEmployeesIds只读.

Mar*_*ell 10

ReportingEmployeesIds = {2345, 432, 521}设置该属性.它是Add(...)每个项目调用的简写.Add即使对于只读列表属性,您也可以随时使用.

要成为一个集合,它需要是:

ReportingEmployeesIds = new List<int> {2345, 432, 521}
Run Code Online (Sandbox Code Playgroud)

相反,行:

Manager m = new Manager {Name = "Dave", ReportingEmployeesIds = {2345, 432, 521} }
Run Code Online (Sandbox Code Playgroud)

基本上是:

var m = new Manager();
m.Name = "Dave";
var tmp = m.ReportingEmployeesIds;
tmp.Add(2345);
tmp.Add(432);
tmp.Add(521);
Run Code Online (Sandbox Code Playgroud)