请考虑以下课程; Getter和Caster,其中Getter检索值T。Caster是Getter的包装器,它封装所检索的值,并且本身就是Getter。
public abstract class Getter<T>
{
public abstract T Get();
}
public class Caster<TIn, TOut> : Getter<TOut>
{
private Getter<TIn> getter;
public Caster(Getter<TIn> getter)
{
this.getter = getter;
}
public TOut Get()
{
return (TOut)(object)getter.Get();
}
}
每次调用Get时,施法者都使用拳击创建垃圾。有什么办法可以缓存盒子并更改值,还是可以避免垃圾?也许有比拳击更好的解决方案?
答案 0 :(得分:1)
您正在对类型系统做一些坏事情。考虑一下 {
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Deploys in the last six hours"
}
}
会发生什么。您将Caster<int, long>
投射到int
,这将导致装箱操作。然后,您尝试将装箱的object
投射到int
上。这将引发long
(请参阅here),因为取消装箱必须是明确的-运行时会尝试将InvalidCastException
强制转换为{{1 }}。由于装箱的方式,您的类不能用于值类型。如果要启用值类型之间的转换,则可能需要看一下IConvertible
界面。