在您的第一个示例中,您正在静态构造函数中更改它,这是允许的,如果您在任何其他静态方法/属性中更改它,这将是编译器错误。
在第二个示例中,您试图更改static readonly
非静态构造函数中的成员,这是不允许的。
您只能更改构造函数static readonly
中的成员static
。这样想,static
构造函数运行一次,然后为每个实例调用实例构造函数。readonly
如果每个实例都可以更改它,则该属性不会很好。
当然,您可以static
readonly
在构造函数中更改非实例成员:
public static readonly bool MaximumRecipientsReached = false;
public readonly bool MyInstanceReadonly = false;
static AdditionalRecipient()
{
// static readonly can only be altered in static constructor
MaximumRecipientsReached = true;
}
public AdditionalRecipient()
{
// instance readonly can be altered in instance constructor
MyInstanceReadonly = true;
}
另外,我对您的“PS:我当然正在使用属性”感到困惑。不能声明属性readonly
,如果您希望这些是属性并且是readonly
-ish,您需要制作它们private set
- 当然,除非您使用的是支持字段。我提出这个的主要原因是因为使用带有私有集的属性将允许您执行代码尝试执行的操作,因为类本身可以更改任何方法或构造函数中的属性(静态或实例),但代码课外不能。
// public getters, private setters...
public static bool MaximumRecipientsReached { get; private set; }
public static IList<EmailAddress> Contacts { get; private set; }