Не удается получить доступ к нестатическому полю

Я не могу понять, почему он ищет что-то статическое:

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» в статическом контексте. Я не вижу ничего статического в базовом classе базы данных, так почему?

вот еще один пример того, когда мы сделали то же самое:

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

ok, так почему же это должна быть статическая строка для строки соединения, которая должна быть передана?

Мы приложили много усилий, чтобы дать сообщения об ошибках, которые являются точными, поэтому внимательно прочитайте их. Сообщение об ошибке сообщает вам, что происходит не так: вы обращаетесь к нестатическому полю в контексте, когда доступ к статистике является законным.

Итак, почему в списке аргументов вызова базового конструктора есть контекст, где для доступа к статистике только законно?

Когда вы вызываете базовый конструктор, аргументы, которые вы передаете, не должны ссылаться на «это» . Зачем? Потому что ни производный конструктор, ни базовый конструктор для вашего «этого» еще не запущены, и поэтому «это» почти наверняка находится в несогласованном, частично инициализированном состоянии. Это рецепт сумасшедших ошибок. Поэтому мы ограничиваем доступ к «этому» до тех пор, пока не узнаем, что, по крайней мере, работает базовый конструктор.

Эта функция поощряет разумную, хорошо упорядоченную, понятную, поддерживаемую и без ошибок конструкторскую логику; Я рекомендую работать с этими гарантиями, а не против них.

Ваша проблема заключается в конструкторе MyDB. Поле экземпляра (MyDB.connectionString) не будет инициализировано до тех пор, пока вызов базового конструктора не вернется, поэтому все внутри base( ... ) находится в статическом контексте. Просто работайте с ним …

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

или еще лучше (как предложил Симон Фокс) …

 public class MyDB : DatabaseBase { public MyDB() : base(ConfigurationManager.AppSettings["MyConnectionString"]) { } } 
  • Как избежать ошибок при использовании CRTP?
  • Как я могу получить путь к папке «Данные приложения» текущего пользователя?
  • Ссылка на multithreading?
  • Глубокий анализ критерия конструкции в C
  • Что такое std :: prom?
  • Enum ToString с удобными строками
  • Как использовать sscanf в циклах?
  • C # Generics не допускает ограничений типа делегата
  • Как правильно отменить регистрацию обработчика событий
  • Статус std :: put_time в GCC?
  • Как сравнивать списки в модульном тестировании
  • Interesting Posts

    Проект строит, но не может публиковать

    C ++ настраиваемый манипулятор streamа, который изменяет следующий элемент в streamе

    Основные данные – сохранение изображений (iPhone)

    iphone – NSTimers в фоновом режиме

    Является ли использование && короткого замыкания безопасным в .NET?

    Добавление корневого элемента в json-ответ (django-rest-framework)

    Хостинг среды выполнения .NET в программе Delphi

    Как разрешить Chrome (браузеру) загружать небезопасный контент?

    Связывание Datagrid в WPF

    «Недопустимый примитив JSON» в обработке Ajax

    Может ли код C ++ быть действительным как в C ++ 03, так и в C ++ 11, но делать разные вещи?

    Зачем начинать ArrayList с начальной пропускной способностью?

    В параллельном коде OpenMP будет ли какая-либо выгода для параллельной работы memset?

    Теория программирования: Решите лабиринт

    Где я могу остановить Windows 7 от спячки, оставив крышку закрытой в течение длительного времени?

    Давайте будем гением компьютера.