我正在尝试从通用委托转换为命名委托。
结果是以下精神(无效的C#):
Action<CustomClass> act = ???;
CustomDelegate d = act;
我试过了
CustomDelegate d = act.Invoke;
CustomDelegate d = new CustomDelegate( act );
CustomDelegate d = new CustomDelegate( x => act(x) );
CustomDelegate d = new CustomDelegate( act.Invoke );
所有这些都在运行时失败,给ArgumentException
错误
委托实例方法不能为'this'。
堆栈的顶部不是我的代码:
在System.MulticastDelegate.ThrowNullThisInDelegateToInstance()
在System.MulticastDelegate.CtorClosed(对象目标,IntPtr methodPtr)
如何转换委托,以免我得到异常?
答案 0 :(得分:2)
我最终通过尝试@DiegoMijelshon's solution for a question on casting delegates找到了答案。通过该解决方案,我获得了NullReferenceException
而不是ArgumentException
。因此我发现问题是因为Action&lt;&gt;我有空(这是一个参数)。因此,诸如以下的空检查解决了我的问题。
CustomDelegate d = adt == null ? null : act.Invoke;
// Though, I actually went with @DiegoMijelshon solution to avoid extra indirection.
然后我去看了反射器(我应该早点完成)并发现它确实是对参数的空检查导致ThrowNullThisInDelegateToInstance
被调用。