доступ к статическому полю до инициализатора
От: retalik www.airbandits.com/
Дата: 19.03.10 06:23
Оценка: 3 (1)
Всем привет,

натолкнулся тут на странную ситуацию, когда статическое поле класса используется до вызова его инициализатора.
Я раньше всегда думал, что в C# это невозможно. Вот, навскидку, цитата из MSDN:

Static members are initialized before the static member is accessed for the first time, and before the static constructor, if any is called.

(http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx)

Удалось сузить код до такого примера:

class Test
{
    public static void Main()
    {
        System.Console.WriteLine(Problem.Message);
    }
}

public class Problem
{
    public static string Message = InnerInstance.Message;
    public class Inner
    {
        public string Message { get { return "Test"; } }
    }
    
    private static readonly Inner _innerInstance = new Inner();
    public static Inner InnerInstance { get{ return _innerInstance; } }
}


Выполнение приводит вот к такой ошибке:

Unhandled Exception: System.TypeInitializationException: The type initializer for 'Problem' threw an exception. ---> System.NullReferenceException: Object reference not set to an instance of an object.
at Problem..cctor()
--- End of inner exception stack trace ---
at Test.Main()


Фактически, проблема в геттере InnerInstance (статическое поле _innerInstance в этот момент равно null). Причём, коллега клянётся, что этот код работал ещё вчера на его машине.
Уважаемые знатоки, слово вам...
Успехов,
Виталий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.