委托实例方法不能为null'this'。转换代表时

时间:2012-11-05 22:19:32

标签: c# .net-3.5 delegates

我正在尝试从通用委托转换为命名委托。

结果是以下精神(无效的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)

如何转换委托,以免我得到异常?

1 个答案:

答案 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被调用。