Из спецификации языка C #
Инициализатор конструктора экземпляра не может получить доступ к создаваемому экземпляру. Следовательно, это ошибка времени компиляции, чтобы ссылаться на это в выражении аргумента инициализатора конструктора, так же как и ошибка времени компиляции для выражения аргумента, чтобы ссылаться на любой элемент экземпляра через simple_name.
т.е. this
может использоваться только для ссылки на другой конструктор в контексте инициализатора конструктора, так как ссылка на текущий экземпляр объекта не будет доступна до завершения построения.
т.е. this
может использоваться только как ключевое слово области видимости до выполнения конструктора:
: this("ParameterForAnotherConstructor")
Но он не доступен как ссылка на экземпляр класса, так как он не завершил построение
: base(this) // Keyword this is not available in this context
И, очевидно, мы также не можем вызывать методы экземпляра из инициализатора конструктора
: base(GetThis()) // Object reference is required
Чтобы решить проблему OP, изменения в базовом классе Mania
кажутся неизбежными, учитывая двустороннюю связь между PlayState
и ManiaGame
(или подклассами ManiaGame
, например PushGame
). Существует много доступных шаблонов для разделения жестких зависимостей, таких как Принцип инверсии зависимостей (т. Е. Абстракция связи между классами) или шаблон Observer - (один из двух классов вызывает события или разрешает обратные вызовы). быть подключенным (например, делегаты или Action
s), позволяя второму классу «наблюдать» изменения состояния без жесткой связи между ними.
Существует аналогичный вопрос переполнения стека, Ключевое слово 'this' (Me) недоступно, вызывая базовый конструктор с обходным решением, аналогичным вашему предложению.