无法访问非静态字段

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

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

那么为什么它必须是连接string传递的静态string?

我们一直在努力提供准确的错误信息,所以仔细阅读。 错误消息告诉你到底发生了什么问题: 你正在访问一个非静态的字段,只有合法的访问静态。

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

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

这个function鼓励合理的,有序的,可理解的,可维护的和无缺陷的构build逻辑; 我build议使用这些保护措施而不是反对这些保护措施。

你的问题是在MyDB的构造函数。 实例字段(MyDB.connectionString)不会初始化,直到对基础构造函数的调用返回,所以base( ... )中的所有内容都在静态上下文中。 只要与它合作…

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

或更好(西蒙·福克斯build议)…

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