c#6中的静态属性

我正在编写一个小代码来更好地理解propertystatic property 。 像这些:

 class UserIdentity { public static IDictionary OnlineUsers { get; set; } public UserIdentity() { OnlineUsers = new Dictionary(); } } 

要么

 class UserIdentity { public IDictionary OnlineUsers { get; } public UserIdentity() { OnlineUsers = new Dictionary(); } } 

自从我改为:

 class UserIdentity { public static IDictionary OnlineUsers { get; } public UserIdentity() { OnlineUsers = new Dictionary(); } } 

它给了我错误信息:

无法将属性或索引器“UserIdentity.OnlineUsers”分配给 – 它是只读的

我知道属性OnlineUsersread only ,但在C#6中,我可以通过构造函数分配它。 那么,我错过了什么?

您正在尝试分配给实例构造函数中的只读静态属性。 这将导致每次创建新实例时都会分配它,这意味着它不是只读的。 您需要在静态构造函数中为其分配:

 public static IDictionary OnlineUsers { get; } static UserIdentity() { OnlineUsers = new Dictionary(); } 

或者你可以直接进行:

 public static IDictionary OnlineUsers { get; } = new Dictionary(); 

首先,您的构造函数缺少括号() 。 正确的构造函数如下所示:

 public class UserIdentity { public UserIdentity() { ... } } 

对于您的问题:只能在特定上下文的构造函数中分配Readonly属性。 static属性不绑定到特定实例,而是绑定到类。

在你的第二个代码片段中, OnlineUsers是非静态的,因此它可以在新实例的构造函数中分配,并且仅在那里。

在您的第三个片段中, OnlineUsers是静态的。 因此,它只能在静态初始化程序中分配。

 class UserIdentity { public static IDictionary OnlineUsers { get; } //This is a static initializer, which is called when the first reference to this class is made and can be used to initialize the statics of the class static UserIdentity() { OnlineUsers = new Dictionary(); } } 

必须在静态构造函数中分配静态只读属性,如下所示:

 public static class UserIdentity { public static IDictionary OnlineUsers { get; } static UserIdentity() { OnlineUsers = new Dictionary(); } }