无法访问非静态字段

时间:2009-09-16 03:26:46

标签: c#

我无法弄清楚为什么它会寻找静态的东西:

public class DatabaseBase
{
    private readonly string connectionString;

    public DatabaseBase(string connectionString)
    {
        this.connectionString = connectionString;
    }
}

public class MyDB : DatabaseBase
{
    readonly string connectionString = ConfigurationManager.AppSettings["MyConnectionString"];

    public MyDB() : base(connectionString)
    {          
    }
}

我得到静态上下文中无法访问非静态字段'connectionString'。我在基础数据库类中没有看到任何静态,所以为什么??

这是另一个我们做同样事情的例子:

partial class Database : DatabaseBase
{
    static string DbConnectionString
    {
        get
        {
            if (dbConnectionString == null)
                dbConnectionString = 
                    ConfigurationManager.AppSettings["MyConnectionString"];
            return dbConnectionString;
        }
    }
    public Database() :base(DbConnectionString)
    {
    }

好的,为什么它必须是要传递的连接字符串的静态字符串?

2 个答案:

答案 0 :(得分:26)

我们努力提供准确的错误消息,因此请仔细阅读。错误消息告诉您确切的错误:您正在访问静态字段,在该上下文中访问静态是合法的。

那么为什么基础构造函数调用参数列表是一个只有合法访问静态的上下文?

当您调用基础构造函数时,传递的参数不得引用“this”。为什么?因为“this”的派生构造函数和基本构造函数都没有运行,因此“this”几乎肯定处于不一致的,部分初始化的状态。这是疯狂错误的秘诀。因此,我们限制您访问“this”,直到我们知道至少基本构造函数已运行。

此功能鼓励合理,有序,易懂,可维护且无错误的构造逻辑;我建议与这些保护措施合作,而不是反对。

答案 1 :(得分:4)

您的问题出在MyDB构造函数中。 在对基础构造函数的调用返回之前,不会初始化实例字段(MyDB.connectionString),因此base( ... )内的所有内容都在静态上下文中。只需使用它...... < / p>

public class MyDB : DatabaseBase
{
    static readonly string connectionString = 
          ConfigurationManager.AppSettings["MyConnectionString"];
    public MyDB() : base(connectionString)
    {
    }
}

或更好(正如Simon Fox所建议的那样)......

public class MyDB : DatabaseBase
{
    public MyDB() : base(ConfigurationManager.AppSettings["MyConnectionString"])
    {
    }
}