4

为什么在拥有auto属性的类中调用初始化程序时,使用对象初始值设定项来设置私有集自动属性成为可能?我列举了两个班。使用对象初始化器设置私有setter

public class MyClass 
{ 
    public string myName { get; private set; } 
    public string myId { get; set; } 

    public static MyClass GetSampleObject() 
    { 
     MyClass mc = new MyClass 
     { 
      myName = "Whatever", // <- works 
      myId = "1234" 
     }; 
     return mc; 
    } 


} 

public class MyOtherClass 
{ 
    public static MyClass GetSampleObject() 
    { 
     MyClass mc = new MyClass 
     { 
      myName = "Whatever", // <- fails 
      myId = "1234" 
     }; 
     return mc; 
    } 
} 
+0

,因为它在同一类范围内 – Reniuz

+2

为什么*不可能? –

+0

@JonSkeet - OP可能会认为'private'意味着在属性范围内? – Oded

回答

3

对setter的private修饰符意味着 - 对于封闭类型是私有的。

也就是说,该属性只能由包含类型设置。

如果不是这种情况,您将永远无法设置该属性,并且该属性将实际为只读状态。

从MSDN - private (C# Reference)

私有成员只能访问内部类的主体或声明它们

+0

我误解了私人二传手的工作原理。我认为初始化器不会与拥有auto私有属性的类处于同一个范围,因此会像访问外部类一样访问该属性。谢谢你们。 – Youngs

0

因为拥有属性的类中访问私有方法的结构。

+0

'在该类中拥有属性和嵌套类的类内,因此@Oded描述'对于封闭类型是私有的“。 –