2013-03-28 116 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