2016-01-14 3 views
3

У меня есть класс со статическим List<T> и некоторые нестатические поля. Теперь я хотел бы, чтобы инициализировать этот список с некоторыми объектами, как так:Использование nameof нестатического поля в инициализаторе статического поля

class C 
{ 
    private Bar bar; 

    private static List<Foo> list = new List<Foo>() 
    { 
     new Foo(nameof(bar)),     // OK 
     new Foo(nameof(bar) + nameof(bar.Baz)) // Error CS0236 
    }; 
} 

При создании первого Foo объекта прекрасно работает, я получаю ошибку

Поля инициализатор не может ссылаться на НЕРАСПРОСТРАНЕНИИ статическое поле, метод или имущество C.bar

на втором.

Я знаю, что статические члены не могут получить доступ к данным экземпляра (см. this question). Но, насколько я понимаю, nameof оценивается во время компиляции и получает доступ только к метаданным, а не к данным экземпляра. Так почему же это не работает и есть ли способ?

ответ

4

Обходной проста, используйте имя типа вместо имени переменной:

new Foo(nameof(bar) + nameof(Bar.Baz)) 

По той причине, почему, я не очень уверен. Может быть, потому что наличие переменной потребует, чтобы компилятор ее инициализировал. (Мы видим, что это не имеет значения, но, возможно, компилятор не настолько умный ...). Ему просто нужны имена статического типа.

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