C# 为什么我可以更改私有静态只读字段而不是公共字段?

C# 为什么我可以更改私有静态只读字段而不是公共字段?,c#,.net,constructor,readonly,static-constructor,C#,.net,Constructor,Readonly,Static Constructor,有这样的代码: public static readonly bool MaximumRecipientsReached; private static readonly IList<EmailAddress> Contacts; static AdditionalRecipient() { Contacts = AnotherClass.Contacts; //works } public AdditionalRe

有这样的代码:

    public static readonly bool MaximumRecipientsReached;
    private static readonly IList<EmailAddress> Contacts;

    static AdditionalRecipient()
    {
        Contacts = AnotherClass.Contacts; //works
    }

    public AdditionalRecipient()
    {
        MaximumRecipientsReached = true; //works not
    }
public static readonly bool maximumRecipients已达到;
私有静态只读IList联系人;
静态附加收件人()
{
Contacts=AnotherClass.Contacts;//有效
}
公共附加收件人()
{
MaximumRecipientsReached=true;//不起作用
}
为什么我可以更改私有静态只读字段而不是公共字段


PS:当然我在使用属性。

在第一个示例中,您在静态构造函数中更改它,这是允许的,如果您在任何其他静态方法/属性中更改它,这将是一个编译器错误

在第二个示例中,您试图更改非静态构造函数中的
静态只读
成员,这是不允许的

只能在
静态
构造函数中更改
静态只读
成员。这样想吧,
静态
构造函数运行一次,然后对每个实例调用实例构造函数。如果每个实例都可以更改该属性,那么该属性就不会是只读的

当然,您可以更改构造函数中的非静态
只读
实例成员:

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;  
}
还有,我被你的“附言:我当然在使用属性”弄糊涂了。属性不能声明为
readonly
,如果您希望这些属性成为
readonly
-ish,则需要将它们设置为
私有集
,当然,除非您使用了支持字段。我提出这个问题的主要原因是,使用带有私有集的属性将允许您执行代码试图执行的操作,因为类本身可以更改任何方法或构造函数中的属性(静态或实例),但类之外的代码不能

// public getters, private setters...
public static bool MaximumRecipientsReached { get; private set; }
public static IList<EmailAddress> Contacts { get; private set; }
//公共getter,私有setter。。。
public static bool maximumRecipients已获取{get;private set;}
公共静态IList联系人{get;private set;}

它与公共构造函数和私有构造函数无关,而是与静态构造函数和非静态构造函数相关

如果尝试在非静态构造函数中设置静态只读项(如第二种情况),编译器会抱怨:

无法将静态只读字段分配给(静态只读字段除外) 构造函数或变量初始值设定项)

这是因为静态成员是在第一次访问类型时初始化的,这可能是在调用任何常规构造函数之前。让静态只读成员可以从实例构造函数修改是没有意义的,因此编译器会对此加以防范


只需将相关成员设置为非静态,或将初始化放入静态构造函数。

MaximumRecipientsReached是只读静态的,您正试图从非静态构造函数设置它。只能在静态构造函数中设置它。

这是因为静态构造函数只能与其他静态成员一起使用,而非静态成员需要实例化对象。因此,如果实例化该类,但该类有一个静态构造函数,则该构造函数将永远不会被调用。

您收到的错误消息是什么?@ChristianFischer:任何时候,这就是我们来这里的目的;-)