如何为 `in` 参数修饰符设置 Moq 回调?

How to setup a Moq Callback for an `in` parameter modifier?

如何为带有 in parameter modifier 的方法设置最小起订量设置回调?

假设你有这个:

public interface ITester
{
   bool IsGood(in int value);
}

这不起作用:

var mock = new Mock<ITester>();
mock.Setup(m => m.IsGood(It.IsAny<int>()))
    .Callback<int>(v => { /* whatever */ });  // ==> runtime error

mock.Object.IsGood(42);

您遇到以下异常:

System.ArgumentException : Invalid callback. Setup on method with parameters (in int) cannot invoke callback with parameters (int).

正确的方法是什么(除了完全删除 in 修饰符;))?

一种可能的解决方案是使用类似的签名(匹配输入参数)定义 delegate 并在回调中使用它 + 在设置中使用 It.Ref<int>.IsAny

public delegate void MyDelegate(in int value);
var d = new MyDelegate((in int a) => { Console.WriteLine($"Number {a}"); });

var mock = new Mock<ITester>();
mock.Setup(m => m.IsGood(It.Ref<int>.IsAny)).Callback(d);

mock.Object.IsGood(42); //Number 42