C# コンパイラで次のエラーが発生しました
CS0191: 読み取り専用フィールドを割り当てることはできません (コンストラクターまたは変数初期化子を除く)
(プライベート関数内の) コードをコンストラクターに移動する必要がありますか? ぎこちないですね。
プライベート メソッドは、コンストラクターによってのみ呼び出されることを意図していたことに注意してください。対応するメソッドをマークするために使用できる何らかの属性があると思います。
C# コンパイラで次のエラーが発生しました
CS0191: 読み取り専用フィールドを割り当てることはできません (コンストラクターまたは変数初期化子を除く)
(プライベート関数内の) コードをコンストラクターに移動する必要がありますか? ぎこちないですね。
プライベート メソッドは、コンストラクターによってのみ呼び出されることを意図していたことに注意してください。対応するメソッドをマークするために使用できる何らかの属性があると思います。
他の投稿が言っていることにもかかわらず、実際にはこれを行い、実際にメソッドに値を割り当てる (やや珍しい) 方法があります。
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";
}
}
読み取り専用フィールドは、コンストラクターによってのみ割り当てることができます。あなたができることは、メソッドでフィールドを初期化することです:
class Foo
{
private readonly Bar _bar = InitializeBar();
private Bar InitializeBar()
{
// Add whatever logic you need to obtain a Foo instance.
return new Bar();
}
}
はい。一般的な方法を使用する代わりに、コンストラクターの連鎖を試しましたか?
public StuffClass(string a, char b, int c)
{
_a = a;
_b = b;
_c = c;
}
public StuffClass(string a, char b)
: this(a, b, 2)
{}
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
の代わりに使用できます。const
string
const
変更したい場合は、最初から読み取り専用にしないでください。変数が読み取り専用になると、エラーが示唆するように、コンストラクターまたは宣言時にのみ変更できます
MSDNによると
キーワードは、
readonly
フィールドで使用できる修飾子です。フィールド宣言にreadonly
修飾子が含まれている場合、宣言によって導入されたフィールドへの割り当ては、宣言の一部として、または同じクラスのコンストラクターでのみ発生できます。