Что означает "инициализатор поля не может ссылаться на нестатические поля" в С#?
Я не понимаю эту ошибку в С#
error CS0236: Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство "Prv.DB.getUserName(long)"
Для следующего кода
public class MyDictionary<K, V>
{
public delegate V NonExistentKey(K k);
NonExistentKey nonExistentKey;
public MyDictionary(NonExistentKey nonExistentKey_) { }
}
class DB
{
SQLiteConnection connection;
SQLiteCommand command;
MyDictionary<long, string> usernameDict = new MyDictionary<long, string>(getUserName);
string getUserName(long userId) { }
}
Ответы
Ответ 1
Любой инициализатор объекта, используемый вне конструктора, должен ссылаться на статические члены, поскольку экземпляр не был создан до тех пор, пока не будет запущен конструктор, а прямая инициализация переменных концептуально будет выполняться до запуска любого конструктора. getUserName - это метод экземпляра, но содержащий экземпляр недоступен.
Чтобы исправить это, попробуйте ввести инициализатор usernameDict внутри конструктора.
Ответ 2
Ниже приведенные ссылки могут пролить свет на то, почему делать то, что вы пытаетесь сделать, может не быть такой хорошей вещью, в частности второй ссылкой:
Почему инициализаторы работают в противоположном порядке как конструкторы? Часть первая
Почему инициализаторы работают в противоположном порядке как конструкторы? Часть вторая
Ответ 3
getUserName - это метод экземпляра.
Измените его на статический, который может работать.
ИЛИ
Инициализировать словарь в конструкторе.
Ответ 4
Вы не можете сделать это, потому что экземпляр должен быть инициализирован, прежде чем вы сможете получить доступ к свойствам своего класса. Инициализаторы полей вызывается перед инициализацией класса.
Если вы хотите инициализировать поле usernameDict с возвращаемым значением метода GetUserName, вы должны сделать это внутри конструктора или сделать метод статическим.