编译器警告(等级 1)C4803

“method”: 引发方法的存储类与事件“event”的存储类不同

事件方法必须与事件声明具有相同的存储类。 编译器调整事件的方法以使存储类相同。

如果具有从接口实现事件的类,则可能会出现此警告。 编译器不会为接口中的事件隐式生成引发方法。 在类中实现该接口时,编译器会隐式生成一个引发方法,该方法不是虚拟的,因此会发出警告。 有关事件的详细信息,请参阅 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();
}