2013-03-28 189 views
0

我簡化了我的問題,因爲擴展方法與它無關。靜態字段無法初始化

這裏是代碼片段:

class MyClass 
{ 
    private static readonly char[] InvalidChars = new []{'\\', '/'}; 


    public MyClass() 
    { 
     if (InvalidChars == null) 
     { 
      //how can this block be accessable? 
     } 
    } 

} 

我的問題是:有沒有在其中時,它在MyClass的構造函數訪問InvalidChars可以返回null任何情況下?顯然有,因爲這是我在我的應用程序中看到的。雖然我無法理解這種可能性。

+5

您提供的代碼不會拋出您描述的異常。我寫了一個簡短但完整的程序,它只是調用'MyClass'構造函數,並沒有問題。請編輯您的問題以顯示證明問題的代碼,否則我們無法診斷。 – 2013-03-28 07:34:02

+0

你在哪裏/如何實例化MyClass?這似乎並不是一種擴展方法。 – 2013-03-28 07:34:38

+0

你是否確定將「SomeName」分配給Name Proeprty? 我會認爲這個名字是null也不是invalidchars。另外嘗試設置一個斷點並啓動調試器 – 2013-03-28 07:36:25

回答

0

Ohoho,我很抱歉,我仔細查看了調用堆棧後發現問題。你是對的,我的代碼示例沒有完成。這是完整版本:

class MyClass 
{ 
    private static readonly MyClass Default = new MyClass(); 
    private static readonly char[] InvalidChars = new []{'\\', '/'}; 


    public MyClass() 
    { 
     if (InvalidChars == null) 
     { 
     //how can this block be accessable? 
     } 
    } 

} 

難怪我得到一個null。

0

由於您已將其標記爲靜態,只能在類的靜態構造函數中初始化只讀變量。

當變量在聲明中初始化,例如:

public readonly int y = 5; 

對於實例字段,在包含該字段聲明,或用於靜態字段的類的實例構造,在包含字段聲明的類的靜態構造方法。這些也是唯一可以將readonly字段作爲out或ref參數傳遞的上下文。

因此,當您在聲明中刪除static關鍵字時,您將能夠在構造函數中初始化變量。

+0

靜態構造函數會導致相同的異常。如果我在那裏設置一個斷點 - 我可以看到它從未被調用過。是的,一切工作正常,如果我讓這個領域不靜態。但這裏的問題是爲什麼,而不是如何。 – 2013-03-28 08:22:58