2011-07-07 25 views
3

次のコードでは、配列(arr)を静的にする必要があるのはなぜですか?C#LINQターゲットは静的である必要があります

静的を削除した場合、LINQクエリでは使用できなくなります。

class A 
{ 
    static int[] arr = { 1, 2, 3, 4 }; 
    IEnumerable<int> result = from i in arr where i < 10 select i; 
} 

ありがとうございます。あなたが直接、変数初期化子を使用して変数を初期化する場合

答えて

3

あなたは他のクラスのインスタンス変数にアクセスすることはできません - あなたの代わりにコンストラクタにコードを移動することができ:C#の仕様から

class A 
{ 
    int[] arr = { 1, 2, 3, 4 }; 
    IEnumerable<int> result; 

    public A() 
    { 
     result = from i in arr where i < 10 select i; 
    } 
} 

10.5.5.2インスタンスフィールドの初期化:インスタンス フィールドの

変数初期化子は が作成されるインスタンスを参照することはできません。したがって、 変数の初期化子が変数 の初期化子が単純名でメンバを参照するためのコンパイル時エラーであるため、 コンパイル時にエラー を変数初期化子に使用しています。

可変初期化子は基本クラスのコンストラクタの前に実行されるため、クラスインスタンスはまだ完全に「構築」されていません。

+0

静的メンバーの作成順序は? – Jake

+0

静的に両方を変更したときはうまくいきました。 –

+0

メモリを割り当てているうちに、それに続く特定の順序はありますか?この議論から、私は静的データが最初に割り当てられ、インスタンスとは別のものであると推測します。なぜなら、静的を使用するのは静的ではなく、静的を使用しないと@BrokenGlassのようにルールが破られるからです。 – Jake

関連する問題