Инициализатор конструктора не позволяет мне использовать «это»
-
03-07-2019 - |
Вопрос
Ключевое слово ошибки компилятора «Это» не доступно в текущем контексте
delegate void CallBack(int i);
class A
{
public A(CallBack cb) { }
}
class B : A
{
public B() : base(new CallBack(this.f)){}
private void f(int i) { }
}
Почему эта ошибка?В качестве решения я подумал о предоставлении защищенного ctor без параметров в A() и получил
class B : A
{
public B() : base() // inherit the new A() ctor
{
base.cb = new CallBack(this.f); //this is allowed here
}
//...
}
Решение
Это потому, что «это» не было создано до тех пор, пока не запустился конструктор базового класса.В вашем втором примере базовый конструктор завершился, и теперь «это» имеет значение.
Другие советы
В первом примере экземпляр B еще не инициализирован.Во втором это так.
Поскольку объект еще не (полностью) создан, то есть базовый конструктор еще не запущен, this
там не доступен.
Вы должны использовать абстрактный/виртуальный метод.
abstract class A {
A() {
this.Initialize();
}
abstract void Initialize() { }
}
class B : A {
string Text;
B() { }
override void Initialize() {
this.Text = "Hello world";
}
}
Не связан с StackOverflow