“字段初始值设定项不能引用非静态字段”在C#中意味着什么?

时间:2009-05-28 21:39:57

标签: c# delegates

我不明白C#中的这个错误

  

错误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) { }
}

4 个答案:

答案 0 :(得分:14)

构造函数外部使用的任何对象初始值设定项都必须引用静态成员,因为在构造函数运行之前尚未构造实例,并且在运行任何构造函数之前概念性地发生直接变量初始化。 getUserName是一个实例方法,但包含的实例不可用。

要解决此问题,请尝试将usernameDict初始化程序放在构造函数中。

答案 1 :(得分:8)

下面的链接可能会说明为什么做你想做的事情可能不是一件好事,特别是第二个链接:

Why Do Initializers Run In The Opposite Order As Constructors? Part One

Why Do Initializers Run In The Opposite Order As Constructors? Part Two

答案 2 :(得分:1)

getUserName是一个实例方法 将其更改为静态,可能有效。

OR

在构造函数中初始化字典。

答案 3 :(得分:1)

您无法执行此操作,因为必须先初始化实例,然后才能访问其类的属性。在初始化类之前调用​​字段初始值设定项。

如果要使用GetUserName-Method的返回值初始化字段usernameDict,则必须在构造函数中执行此操作,或使Method为静态方法。