C# 如何将非泛型委托强制转换为泛型委托

C# 如何将非泛型委托强制转换为泛型委托,c#,generics,delegates,C#,Generics,Delegates,我想创建一个具有以下签名的实例: public delegate void ValueGetter<TValue>(ref TValue value); 然而,这并不理想,因为它涉及拳击。有更好的方法吗?首先,我不确定代码是否实际装箱了值。仅当您将值存储在对象中时,它才会显示为一个框,而您不这样做。您只需将其丢弃两次,这在现实中可能会被优化掉 其次,不清楚为什么这会成为一个问题 第三,抛出异常似乎很奇怪。在什么情况下会使用除int之外的其他内容?在这些情况下,例外情况是否是适当的响

我想创建一个具有以下签名的实例:

public delegate void ValueGetter<TValue>(ref TValue value);

然而,这并不理想,因为它涉及拳击。有更好的方法吗?

首先,我不确定代码是否实际装箱了值。仅当您将值存储在
对象中时,它才会显示为一个框,而您不这样做。您只需将其丢弃两次,这在现实中可能会被优化掉

其次,不清楚为什么这会成为一个问题


第三,抛出异常似乎很奇怪。在什么情况下会使用除
int
之外的其他内容?在这些情况下,例外情况是否是适当的响应?

为什么装箱是一个问题?@DStanley Performance。从链接中可以看出,Microsoft出于性能原因编写了这个奇怪的委托,这就是为什么它不简单地返回
TValue
。您是否存在可测量的性能问题?我看不到链接地址仅针对性能的效率,在本文中,我将其解释为更容易编码。@DStanley它绝对不容易编码,因此它一定意味着性能!我所说的更容易编码是指与另一种方式相比。如果没有委托,您如何获得值?1)我刚刚对其进行了基准测试,使用泛型和非泛型调用了方法,它们占用了相同的时间,因此没有装箱似乎是正确的。2) 众所周知,拳击不好。3) 你是对的,我刚刚添加了异常以使方法看起来完整。实际上,如果
TValue
类型错误,它应该抛出。
public void GetVal<TValue>(ref TValue val)
{
    if (typeof(TValue) != typeof(int))
        throw new NotSupportedException();
    val = (TValue)(object)myInt;
}