我有以下电话:
ExecutionContext::Run(item->Context, gcnew ContextCallback(item, &WaitQueueItem::Callback), item->State);
其中WaitQueueItem
如下:
ref class WaitQueueItem
{
public:
WaitQueueItem(){}
WaitCallback^ Callback;
Object^ State;
ExecutionContext^ Context;
};
WaitCallback
在public delegate void WaitCallback(Object^ state)
命名空间中定义为System::Threading
。
编译会出现以下错误:
错误C2843: 'Foo :: Bar :: Data :: ContainingClass :: WaitQueueItem :: Callback':不能 获取托管的非静态数据成员或方法的地址 型
如果我提供的函数与WaitCallback
委托具有相同的签名,则会编译。用dotPeek挖掘,我看到用C#
ExecutionContext.Run(item.Context, new ContextCallback(item.Callback), item.State);
看起来像这样:
ExecutionContext.Run(item.Context, new ContextCallback(item.Callback.Invoke), item.State);
有没有办法在不必编写包装函数的情况下传递委托?
提前致谢
答案 0 :(得分:0)
也许你想要
gcnew ContextCallback(item->Callback, &WaitCallback::Invoke)
(相当于C#编译器所做的,绑定对象实例item->Callback
及其Invoke
方法)