Конструктор инициализатор не позволяет мне использовать «это» - PullRequest
0 голосов
/ 29 апреля 2009

Ошибка компилятора Ключевое слово "this" недоступно в текущем контексте

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
     }
     //...
}

Ответы [ 4 ]

15 голосов
/ 29 апреля 2009

Это потому, что "this" не было создано, пока не запустился конструктор базового класса Во втором примере базовый конструктор завершен, и теперь значение «this» имеет значение.

1 голос
/ 29 апреля 2009

В первом примере экземпляр B еще не инициализирован. Во втором это.

0 голосов
/ 29 апреля 2009

Вы должны использовать абстрактный / виртуальный метод.

abstract class A {
    A() {
        this.Initialize();
    }

    abstract void Initialize() { }
}

class B : A {
    string Text;

    B() { }

    override void Initialize() {
        this.Text = "Hello world";
    }
}
0 голосов
/ 29 апреля 2009

Поскольку объект еще не (полностью) построен, то есть базовый конструктор еще не был запущен, this там недоступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...