2013-03-28 2 views
0

Я упростил свой вопрос, поскольку методы расширения не имели к этому никакого отношения.Статическое поле не инициализируется

Вот фрагмент кода:

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


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

} 

Мой вопрос: есть ли сценарий, в котором InvalidChars может возвращать нуль, если она доступна в MyClass конструктор? Очевидно, что есть, потому что это то, что я вижу в своем приложении. Хотя я не понимаю, как это возможно.

+5

Код, который вы указали, не генерирует исключение, которое вы описали. Я написал короткую, но полную программу, которая просто называется конструктором MyClass, и все в порядке. Измените свой вопрос, чтобы показать код, который демонстрирует проблему, иначе нам будет невозможно диагностировать. –

+0

Где/как вы создаете экземпляр 'MyClass'? Это вообще не похоже на метод расширения. –

+0

Вы уверены, что «SomeName» присвоено имя Proeprty? Я бы предположил, что это имя равно null или недопустимым. Также попробуйте установить точку останова и запустить отладчик –

ответ

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? 
     } 
    } 

} 

Неудивительно, что я получал нуль.

0

Поскольку вы отметили его как статический, переменная readonly может быть инициализирована только в статическом конструкторе класса.

Когда переменный инициализируются в объявлении, например:

public readonly int y = 5; 

Для поля экземпляра, в конструкторах экземпляров класса, который содержит объявление поля, или для статического поля, в статический конструктор класса, который содержит объявление поля. Это также единственные контексты, в которых можно передать поле readonly в качестве параметра out или ref.

Следовательно, при удалении ключевого слова static в объявлении вы сможете инициализировать переменную в конструкторе.

+0

Статический конструктор вызывает одно и то же исключение. Если я установил точку останова там, я вижу, что она не называется никогда. И да, все работает отлично, если я делаю это поле не статическим. Но вопрос здесь в том, почему, а не как. –

Смежные вопросы