在C#中 "字段初始化器不能引用非静态字段 "是什么意思?

问题描述 投票:12回答:4

我不明白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) { }
}
c# delegates
4个回答
15
投票

任何在构造函数之外使用的对象初始化器都必须引用静态成员,因为在构造函数运行之前,实例还没有被构造,而直接变量初始化在概念上发生在任何构造函数运行之前。 getUserName是一个实例方法,但包含的实例不可用。

要解决这个问题,可以尝试把usernameDict初始化器放在构造函数里面。



1
投票

getUserName是一个实例方法。把它改成静态的,可能会有用。

或者

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


1
投票

你不能这样做,因为在访问其类的属性之前,必须先初始化实例。字段初始化器在类被初始化之前被调用。

如果你想用GetUserName-Method的返回值来初始化字段usernameDict,你必须在构造函数中进行初始化,或者把Method做成静态的。

© www.soinside.com 2019 - 2024. All rights reserved.