【问题标题】:How to create a generic type on the Action delegate with a ByRef parameter?如何使用 ByRef 参数在 Action 委托上创建泛型类型?
【发布时间】:2021-04-17 20:14:51
【问题描述】:

我正在尝试使用 by-ref 参数作为参数在 Action 类型上创建委托。但我被困在如何实现这一点上。

这就是我目前得到的:

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);
    }
}

在委托中使用“t1”的问题是签名不匹配。这是意料之中的,因为我通过引用传递结构。

t2 也不起作用,因为它抱怨我不能使用 By-ref 参数作为参数列表类型。 :(

在我的示例中,有没有办法使用 to Foo 创建委托?还是我必须删除 in 修饰符?

【问题讨论】:

    标签: c# in-parameters


    【解决方案1】:

    不,您不能使用 by-ref 参数创建Action&lt;T&gt;,因为该方面是委托签名的一部分,它是预定义的并且不在您的控制范围内。您必须定义自己的委托类型,就像您对Foo 所做的那样。此委托类型可以是泛型的,但不能声明变体 - 协变和逆变都与(变体类型的)by-ref 参数不兼容。

    【讨论】:

    • 谢谢,提示“此委托类型可能是通用的”是我所缺少的 :)。现在我几乎达到了我的目标......如果你有一个 byref 类型,你是否也碰巧知道如何获得 non-ref 类型? IE。在上面的示例中,如果我有类型“MyStruct&”的实例,如何访问“typeof(MyStruct)”?我的意思是,我可以做类似Type.GetType(mytype.AssemblyQualifiedName.Replace("&amp;", "")) 之类的事情,但这有点...... urks!
    • 知道了。 mytype.GetElementType()
    猜你喜欢
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2012-10-04
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多