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描述'對於封閉類型是私有的「。 –