22

C# コンパイラで次のエラーが発生しました

CS0191: 読み取り専用フィールドを割り当てることはできません (コンストラクターまたは変数初期化子を除く)

(プライベート関数内の) コードをコンストラクターに移動する必要がありますか? ぎこちないですね。

プライベート メソッドは、コンストラクターによってのみ呼び出されることを意図していたことに注意してください。対応するメソッドをマークするために使用できる何らかの属性があると思います。

4

6 に答える 6

30

他の投稿が言っていることにもかかわらず、実際にはこれを行い、実際にメソッドに値を割り当てる (やや珍しい) 方法があります。

public class Foo
{
    private readonly string _field;

    public Foo(string field)
    {
        Init(out _field, field);
    }

    private static void Init(out string assignTo, string value)
    {
        assignTo = value;
    }
}

hereから派生した例。

または、プライベート メソッドから値を返し、次のようにコンストラクターで割り当てることもできます。

class Foo
{
    private readonly string _field;

    public Foo()
    {
        _field = GetField();
    }

    private string GetField()
    {
        return "MyFieldInitialization";
    }
}
于 2012-08-22T13:00:11.877 に答える
6

読み取り専用フィールドは、コンストラクターによってのみ割り当てることができます。あなたができることは、メソッドでフィールドを初期化することです:

class Foo
{
    private readonly Bar _bar = InitializeBar();

    private Bar InitializeBar()
    {
        // Add whatever logic you need to obtain a Foo instance.
        return new Bar();
    }
}
于 2011-07-28T08:59:07.007 に答える
4

はい。一般的な方法を使用する代わりに、コンストラクターの連鎖を試しましたか?

public StuffClass(string a, char b, int c)
{
    _a = a;
    _b = b;
    _c = c;
}

public StuffClass(string a, char b)
   : this(a, b, 2) 
{}
于 2011-07-27T17:13:37.380 に答える
1

readonlyメンバーは、クラスレベルまたはそのコンストラクターでのみ割り当てることができます。readonlyこれが、キーワードを使用するメリットです。

class Foo
{
    private readonly Foo _foo = new Foo(); // Valid

    public Foo()
    {
        _foo = new Foo(); // Valid
    }

    private void SomeMethod()
    {
        _foo = new Foo(); // Not valid
    }
}

コンパイラではクラスにを割り当てることができないため、「クラス以外」のクラスを使用する場合は、キーワードreadonlyの代わりに使用できます。conststringconst

于 2011-07-27T17:17:21.070 に答える
0

変更したい場合は、最初から読み取り専用にしないでください。変数が読み取り専用になると、エラーが示唆するように、コンストラクターまたは宣言時にのみ変更できます

MSDNによると

キーワードは、readonlyフィールドで使用できる修飾子です。フィールド宣言にreadonly修飾子が含まれている場合、宣言によって導入されたフィールドへの割り当ては、宣言の一部として、または同じクラスのコンストラクターでのみ発生できます。

于 2011-07-27T17:13:58.747 に答える