Поделиться через


Ошибка компилятора C3918

использование требует, чтобы "член" был членом данных

C3918 может возникать по нескольким причинам, связанным с событиями.

Примеры

C3918 может возникать, так как член класса требуется в текущем контексте. Следующий пример приводит к возникновению ошибки 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 также вызывается при попытке проверить тривиальное событие для null (имя события больше не будет предоставлять прямой доступ к делегату резервного хранилища для события).

Следующий пример приводит к возникновению ошибки 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 также может возникать, если вы неправильно подписаны на событие. Следующий пример приводит к возникновению ошибки 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;
}