2011-07-07 46 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

您不能訪問其他類的實例變量,如果你直接使用變量初始化初始化變量 - 你可以將代碼移到構造函數來代替:

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

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

從C#規範,10.5.5.2實例字段初始化

一個實例 字段變量初始值不能引用該實例 被創建。因此,編譯時錯誤在變量初始值設定項中引用此 ,因爲它是 編譯時錯誤的變量 初始化程序通過簡單名稱引用任何實例 成員。

這是有道理的,因爲變量初始化器是在基類構造函數之前執行的,因此類實例尚未完全「構造」。

+0

靜態構件的構建順序是什麼? – Jake

+0

奇怪的是,當你將它們都改爲靜態時它就起作用了。 –

+0

分配內存時,是否有任何特定的順序?從這個討論我推斷,靜態數據首先被分配,並與實例分開,這就是爲什麼在這種情況下使用靜態工作,而不是使用靜態會破壞規則,如@BrokenGlass – Jake