Использование nameof нестатического поля в инициализаторе статического поля
У меня класс со статикой List<T>
и некоторые нестатические поля. Теперь я хотел бы инициализировать этот список некоторыми объектами, такими как:
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
На втором.
Мне известно, что статические члены не могут получить доступ к данным экземпляра (см. Этот вопрос). Но насколько я понимаю, nameof
оценивается во время компиляции и получает доступ только к метаданным, а не к данным экземпляра. Так почему же это не работает и есть ли способ обойти?
1 ответ
Обходной путь прост, используйте имя типа вместо имени переменной:
new Foo(nameof(bar) + nameof(Bar.Baz))
По этой причине я не очень уверен. Возможно, потому что наличие переменной потребовало бы, чтобы компилятор инициализировал ее. (Мы видим, что это не имеет значения, но, возможно, компилятор не настолько умен...). Ему просто нужны статические имена типов.