L'initialiseur de constructeur ne me permet pas d'utiliser 'this'
-
03-07-2019 - |
Question
Erreur du compilateur Le mot clé 'this' n'est pas disponible dans le contexte actuel
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) { }
}
Pourquoi cette erreur? En guise de solution, j’ai pensé fournir un ctor protégé sans paramètre dans A () et
class B : A
{
public B() : base() // inherit the new A() ctor
{
base.cb = new CallBack(this.f); //this is allowed here
}
//...
}
La solution
C'est parce que "cela" n'a pas été créé tant que le constructeur de la classe de base n'a pas été exécuté. Dans votre deuxième exemple, le constructeur de base est terminé, et maintenant "this" a un sens.
Autres conseils
Dans le premier exemple, l'instance B n'est pas encore initialisée. Dans le second, c’est.
Etant donné que l'objet n'est pas encore construit, le constructeur de base n'a pas encore été exécuté, this
n'est pas disponible à cet emplacement.
Vous devriez utiliser une méthode abstraite / virtuelle.
abstract class A {
A() {
this.Initialize();
}
abstract void Initialize() { }
}
class B : A {
string Text;
B() { }
override void Initialize() {
this.Text = "Hello world";
}
}