0

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

结果符合以下精神(无效的 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错误

委托给实例方法不能有 null 'this'。

不是我的代码的堆栈顶部是:

在 System.MulticastDelegate.ThrowNullThisInDelegateToInstance()

在 System.MulticastDelegate.CtorClosed(对象目标,IntPtr methodPtr)

如何转换委托以使我没有异常?

4

1 回答 1

3

我最终通过尝试@DiegoMijelshon's solution for a question on cast delegates找到了答案。使用该解决方案,我得到了 aNullReferenceException而不是ArgumentException. 因此我发现问题是因为我拥有的 Action<> 为空(它是一个参数)。因此,如下所示的空检查解决了我的问题。

CustomDelegate d = adt == null ? null : act.Invoke;
// Though, I actually went with @DiegoMijelshon solution to avoid extra indirection.

然后我去看看反射器(我应该早点做),发现它确实是对导致ThrowNullThisInDelegateToInstance被调用的参数的空检查。

于 2012-11-05T22:19:31.953 回答