2012-02-29 20 views
4
class foo { 
    public readonly int bar; 
}; 
foo a = new foo() { bar = 123 }; 

error CS0191: A readonly field cannot be assigned to (except in a constructor or a variable initializer)オブジェクト初期化子にreadonlyメンバー変数を割り当てるにはどうすればいいですか?

は、どのように私は上記のオブジェクト初期化子でbar割り当てることができますか?

すべてのクラス/構造体にカスタムコンストラクタを記述することなく、読み取り専用メンバを初期化できますか?あなたが見ることができるように

答えて

5
foo a = new foo() { bar = 123 }; 

foo temp = new foo(); 
temp.bar = 123; 
foo a = temp; 

にコンパイラによって変換され、barへの代入はどちらfooコンストラクタや変数の初期化子ではありません。

答えは次のとおりです。あなたはできません。

+0

は、設計者からの監督のように思えます。」 ( –

+0

@ tm1rbrtいいえ、監視はありません。適切なカプセル化については、 – scibuff

+0

@scibuffについて教えてください。 –

0
class Foo { 
    private int bar; 

    public Foo(int bar){ 
     this.bar = bar; 
    } 

    public int Bar { 
     get { return this.bar; } 
    } 
} 

Foo foo = new Foo(123); 
0

あなたは、コンストラクタの中で値を渡す:コンパイラがあなたを語っている何

public class foo 
{ 
    public readonly int _bar; 

    public foo(int bar) 
    { 
     _bar = bar; 
    } 
}; 


var x = new foo(12345); 

は、あなたの読み取り専用フィールドを設定することができる唯一の場所は、それを保持しているクラスのコンストラクタにこの手段であるということです:

  • あなたは、オブジェクトの存続期間中に変更する必要があるならば、readonlyは、クラスの各インスタンスは読み取り専用membeにカスタム値を保持する必要がある場合
  • を使用するための正しい選択ではありませんR変数その後、あなたの代わりに、ちょうどそのパブリックプロパティとして公開、私はあなたの読み取り専用フィールドこのような公共を作るために良い方法ではないことを示唆しているコンストラクタ

の一部としてそれを注入する必要がありますゲッターしかありません。

0

できません。そのためにコンストラクタを使用する必要があります。 MSDN

0

できません。エラーは、あなたが使用しているオブジェクト初期化構文はコンストラクタとメンバーへの割り当てを呼び出すためだけの構文糖である

class foo { 
    public readonly int bar = blabla; 
}; 

使うことができることをあなたに伝えたいと考えてどのような。そしてそれは読者だけに許されていません。


コンストラクタパラメータを導入し、次にコンストラクタで割り当てる必要があります。 C#は、不変型の構文砂糖に関してはかなり不足しています。

2

他の回答の要約:エラーメッセージは役に立ちません。オブジェクト初期化子は読み取り専用フィールドでは使用できません。

ただし、名前付き引数を持つコンストラクタができ、そうする構文は非常に似ています。あなたが実際に見たことはこれだったとき(私がされているように)あなたも、あなたが読み取り専用フィールドのためのC#のオブジェクト初期化子を見てきたことを考えるかもしれないので、同様の

class Foo { 
    public Foo(int bar) { 
     this.bar = bar; 
    } 
    public readonly int bar; 
}; 

Foo a = new Foo(bar: 123); 
// instead of `new Foo() { bar = 123 };` 
+1

まさに! 1時間を検索して、多くの高い投票済みの回答を読んだら、最終的に正しい答えは、私が無意識のうちに初期化リストが読み取り専用にできないと信じられない理由を理解することさえできます。なぜ私はまだ疑問に思っていますが、コンストラクタの名前付きパラメータも同様に便利です。 –

関連する問題