次の方法で共有


コンパイラの警告 (レベル 1) C4803

'method' : raise メソッドはイベント 'event' のストレージ クラスとは異なるストレージ クラスを持っています

イベント メソッドには、イベント宣言と同じストレージ クラスが必要です。 ストレージ クラスが同じになるよう、コンパイラによってイベントのメソッドが調整されます。

この警告は、インターフェイスからイベントを実装するクラスがある場合に発生する可能性があります。 コンパイラは、インターフェイス内のイベントの raise メソッドを暗黙的に生成しません。 クラスにこのインターフェイスを実装すると、コンパイラによって raise メソッドが暗黙的に生成され、そのメソッドは仮想にならないため、警告が発生します。 イベントの詳細については、event に関するページを参照してください。

警告を無効にする方法については、「warning pragma」を参照してください。

次の例では C4803 が生成されます。

// C4803.cpp
// compile with: /clr /W1
using namespace System;

public delegate void Del();

ref struct E {
   Del ^ _pd1;
   event Del ^ E1 {
      void add (Del ^ pd1) {
         _pd1 = dynamic_cast<Del ^>(Delegate::Combine(_pd1, pd1));
      }

      void remove(Del^ pd1) {
         _pd1 = dynamic_cast<Del^> (Delegate::Remove(_pd1, pd1));
      }

      virtual void raise() {   // C4803 warning (remove virtual)
         if (_pd1)
            _pd1();
      }
   }

   void func() {
      Console::WriteLine("In E::func()");
   }
};

int main() {
   E ^ ep = gcnew E;
   ep->E1 += gcnew Del(ep, &E::func);
   ep->E1();
   ep->E1 -= gcnew Del(ep, &E::func);
   ep->E1();
}