Что означает "инициализатор поля не может ссылаться на нестатические поля" в С#?

Я не понимаю эту ошибку в С#

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, вы должны сделать это внутри конструктора или сделать метод статическим.