无法访问非静态字段

Pos*_*Guy 8 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)
    {          
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Eri*_*ert 27

我们努力提供准确的错误消息,因此请仔细阅读.错误消息告诉您到底出了什么问题:您正在访问上下文中的非静态字段,在该上下文中访问静态是合法的.

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

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

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


Av *_*zur 4

您的问题出在 MyDB 构造函数中。在对基本构造函数的调用返回之前,实例字段 (MyDB.connectionString) 不会被初始化,因此内部的所有内容都base( ... )在静态上下文中。只要用它工作...

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

或者更好(正如西蒙·福克斯的建议)......

public class MyDB : DatabaseBase
{
    public MyDB() : base(ConfigurationManager.AppSettings["MyConnectionString"])
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您的解决方案很好,但您的分析“完全错误”。实例字段将在调用基本构造函数之前初始化。构造顺序为:派生字段初始值设定项、基字段初始值设定项、基本构造函数主体、派生构造函数主体。 (3认同)