gpt4 book ai didi

c# - 将类型参数转换为基本类型而不装箱

转载 作者:行者123 更新时间:2023-11-30 22:41:28 26 4
gpt4 key购买 nike

有什么方法可以使这样的代码工作:

public class Func2<A, B>
{
private Func<A, B> f;

public Func2(Func<A, B> f)
{
this.f = f;
}

public object invoke(object obj, long l)
{
if (typeof(B) == typeof(long))
{
if (obj != null)
l = (long)obj;
return f((B)l); //error! cannot convert type 'long' to 'B'
} else {
return f((B)obj);
}
}
}

这里的问题是,如果不先将 B 转换为 object,我就不能直接将 B 转换为 long。我试图不惜一切代价避免装箱,因为它会减慢对功能的快速操作。那么有什么办法可以实现吗?

我知道我实际上可以定义一个专门的 Func2 来专门处理 B 是长整型的情况。但是随着函数数量的增加,长整型和对象的组合呈指数级增长——在实际用例中我还想支持 double !。没有拳击有没有办法支持这个?也许有不安全的代码?

谢谢!因

最佳答案

您可以重载该方法,而不是强制转换 longA ,您可以将委托(delegate)转换为 Func<long, B> :

public class Func2<A, B> {

private Func<A, B> f;

public Func2(Func<A, B> f) {
this.f = f;
}

public B invoke(long a) {
if (typeof(A) == typeof(long)) {
return (f as Func<long, B>)(a);
} else {
throw new NotSupportedException();
}
}

public B invoke(object a) {
return f((A)a);
}

}

例子:

Func2<long, string> f = new Func2<long, string>(l => l.ToString());

Console.WriteLine(f.invoke(42)); // calls the invoke(long) method
Console.WriteLine(f.invoke("x")); // calls the invoke(object) method

关于c# - 将类型参数转换为基本类型而不装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4807768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com