Teilen über


Compilerfehler C3918

Für die Verwendung muss "Mitglied" ein Datenmitglied sein.

Bemerkungen

C3918 kann aus verschiedenen Gründen im Zusammenhang mit Ereignissen auftreten.

Beispiele

C3918 kann auftreten, da ein Klassenelement im aktuellen Kontext erforderlich ist. Im folgenden Beispiel wird C3918 generiert.

// 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 wird auch verursacht, wenn Sie versuchen, ein triviales Ereignis auf NULL zu überprüfen (der Ereignisname bietet keinen direkten Zugriff mehr auf den Sicherungsspeicherdelegat für das Ereignis).

Im folgenden Beispiel wird C3918 generiert.

// 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 kann auch auftreten, wenn Sie ein Ereignis falsch abonniert haben. Im folgenden Beispiel wird C3918 generiert.

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