我正在尝试使用 by-ref 参数作为参数在 Action<> 类型上创建委托(delegate)。但我一直不知道如何实现这一目标。
这就是我到目前为止得到的:
using System;
class Program
{
struct MyStruct { }
static void FooFn(in MyStruct s) { }
delegate void Foo (in MyStruct s);
public static void Main(string[] args)
{
Foo f = FooFn;
var t1 = typeof(Action<>).MakeGenericType(typeof(MyStruct));
var t2 = typeof(Action<>).MakeGenericType(typeof(MyStruct).MakeByRefType());
var d = Delegate.CreateDelegate(t1, null, f.Method);
}
}
在委托(delegate)中使用“t1”的问题是签名不匹配。这是预料之中的,因为我通过引用传递结构。
t2 也不起作用,因为它提示我无法使用 By-ref 参数作为参数列表类型。 :(
在我的示例中,有没有办法创建 Foo 的委托(delegate)?或者我是否必须删除 in-修饰符?
最佳答案
不,您不能创建 Action<T>
使用 by-ref 参数,因为该方面是委托(delegate)签名的一部分,它是预定义的并且超出了您的控制范围。您必须定义自己的委托(delegate)类型,就像您对 Foo
所做的那样。 。此委托(delegate)类型可以是通用的,但不能声明方差 - 协方差和逆变都不与(变体类型的)by-ref 参数兼容。
关于c# - 如何使用 ByRef 参数在 Action 委托(delegate)上创建泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67142556/