c# - 如何使用 ByRef 参数在 Action 委托(delegate)上创建泛型类型?

标签 c# in-parameters

我正在尝试使用 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/

相关文章:

c# - Lambda 在加入时不相等

c# - 避免将 `in` 与结构一起使用而不会使结构成为只读而降低性能?

c# - 为什么 C# 7.2 功能不能在 UWP 应用程序中编译?

C# 7.2 对运算符使用 "in parameter"

c# - 如何在警报 javascript 中正确显示此字符串

c# - 无法解析类型 'Microsoft.AspNetCore.Identity.RoleManager` 的服务

c# - 并非所有代码路径在循环时都返回值

c# - Xamarin 设置相机分辨率