Инициализатор конструктора не позволяет мне использовать «это»

StackOverflow https://stackoverflow.com/questions/802317

  •  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";
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top