Erreur du compilateur C3918
l’utilisation exige que « membre » soit un membre de données
C3918 peut se produire pour plusieurs raisons liées aux événements.
Exemples
C3918 peut se produire, car un membre de classe est requis dans le contexte actuel. L’exemple suivant génère l’erreur C3918.
// C3918.cpp
// compile with: /clr /c
public ref class C {
public:
System::Object ^ o;
delegate void Del();
event Del^ MyEvent {
void add(Del^ev) {
if ( MyEvent != nullptr) {} // C3918
if ( o != nullptr) {} // OK
}
void remove(Del^){}
}
};
C3918 est également provoqué si vous essayez de vérifier un événement trivial pour null (le nom de l’événement ne fournit plus d’accès direct au délégué du magasin de stockage pour l’événement).
L’exemple suivant génère l’erreur C3918.
// C3918_2.cpp
// compile with: /clr /c
using namespace System;
public delegate int MyDel(int);
interface struct IEFace {
event MyDel ^ E;
};
ref struct EventSource : public IEFace {
virtual event MyDel ^ E;
void Fire_E(int i) {
if (E) // C3918
E(i);
}
};
C3918 peut également se produire si vous vous abonnez incorrectement à un événement. L’exemple suivant génère l’erreur C3918.
// C3918_3.cpp
// compile with: /clr /c
using namespace System;
public delegate void del();
public ref class A {
public:
event del^ e {
void add(del ^handler ) {
d += handler;
}
void remove(del ^handler) {
d -= handler;
}
void raise() {
d();
}
}
del^ d;
void f() {}
A() {
e = gcnew del(this, &A::f); // C3918
// try the following line instead
// e += gcnew del(this, &A::f);
e();
}
};
int main() {
A a;
}