El inicializador de constructor no me permite usar 'esto'
-
03-07-2019 - |
Pregunta
Error del compilador La palabra clave 'this' no está disponible en el contexto actual
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) { }
}
¿Por qué es este error? Como solución, pensé en proporcionar un ctor protegido sin parámetros en A () y tener
class B : A
{
public B() : base() // inherit the new A() ctor
{
base.cb = new CallBack(this.f); //this is allowed here
}
//...
}
Solución
Es porque " esto " no se ha creado hasta que se haya ejecutado el constructor de la clase base. En su segundo ejemplo, el constructor base ha terminado, y ahora " esto " tiene significado.
Otros consejos
En el primer ejemplo, la instancia B aún no se ha inicializado. En el segundo, lo es.
Dado que el objeto aún no está (completamente) construido, es decir, el constructor base aún no se ejecutó, this
no está disponible allí.
Debe usar un método abstracto / virtual.
abstract class A {
A() {
this.Initialize();
}
abstract void Initialize() { }
}
class B : A {
string Text;
B() { }
override void Initialize() {
this.Text = "Hello world";
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow