为何Moq中用方法组替代Lambda传Callback会报错?如何转InvocationAction?
Moq中Callback方法组转换InvocationAction编译错误的原因与解决办法
错误原因
Moq的Callback方法包含多个重载,其中无参重载对应的委托类型是InvocationAction(无返回值、无参数)。当直接传递方法组FakeCaptureTargetScreen时,编译器无法自动推断出你要使用带4个参数的Callback重载,反而尝试匹配无参的InvocationAction重载——而你的方法是带4个参数的,类型不匹配,因此抛出编译错误。
解决办法
方法一:显式指定Callback的泛型参数
通过明确声明泛型参数,告诉编译器要匹配的参数类型,就能正确绑定到对应的重载:
_mockScreener .Setup(x => x.CaptureTargetScreen( It.IsAny<string>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<Action<Bitmap>>() )) .Callback<string, int, int, Action<Bitmap>>(FakeCaptureTargetScreen);
方法二:用Lambda包装方法组
如果不想写泛型参数,也可以把方法组包装进Lambda表达式,让编译器能正确推断参数类型:
_mockScreener .Setup(x => x.CaptureTargetScreen( It.IsAny<string>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<Action<Bitmap>>() )) .Callback((string windowTitle, int offsetFromLeft, int offsetFromBottom, Action<Bitmap> onImageCaptured) => FakeCaptureTargetScreen(windowTitle, offsetFromLeft, offsetFromBottom, onImageCaptured) );
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

