No se puede acceder al campo no estático

No puedo entender por qué está buscando algo estático:

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

Obtengo No puedo acceder al campo no estático ‘connectionString’ en contexto estático. No veo nada estático en la clase base de la base de datos, ¿por qué?

Aquí hay otro ejemplo de cuando hicimos algo parecido:

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

ok entonces, ¿por qué tenía que ser una cadena estática para que se pasara la cadena de conexión?

Nos hemos esforzado mucho para proporcionar mensajes de error que sean precisos, así que léalos detenidamente. El mensaje de error le dice exactamente lo que está pasando mal: está accediendo a un campo no estático en un contexto donde es legal acceder a estadísticas.

Entonces, ¿por qué un argumento de llamada de constructor base lista un contexto donde es legal acceder a estática?

Cuando llamas a un constructor base, los argumentos que pasas no deben hacer referencia a “esto” . ¿Por qué? Debido a que ni el constructor derivado ni el constructor base para su “esto” se han ejecutado todavía, y por lo tanto, “esto” está casi seguro en un estado incoherente parcialmente inicializado. Esa es una receta para errores locos. Por lo tanto, le restringimos el acceso a “esto” hasta que sepamos que, como mínimo, se ha ejecutado el constructor base.

Esta característica fomenta una lógica de construcción sensata, bien ordenada, comprensible, fácil de mantener y sin errores; Recomiendo trabajar con, y no en contra de, esas salvaguardas.

Tu problema está en el constructor MyDB. El campo de instancia (MyDB.connectionString) no se inicializará hasta que la llamada al constructor base vuelva, por lo que todo dentro de base( ... ) está en el contexto estático. Solo trabaja con eso …

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

o mejor aún (como lo sugirió Simon Fox) …

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