C# 避免拳击和拳击;泛型类中的拆箱

C# 避免拳击和拳击;泛型类中的拆箱,c#,generics,boxing,unboxing,C#,Generics,Boxing,Unboxing,下面是一些快速代码来说明我的问题。有没有办法避免这种显然不必要的装箱/拆箱 public class TestClass<T> { public T TestMethod() { if (typeof(T) == typeof(bool)) { return true; // doesn't work return (T)(object)true; // works, but any way to avoid this? }

下面是一些快速代码来说明我的问题。有没有办法避免这种显然不必要的装箱/拆箱

public class TestClass<T>
{
  public T TestMethod()
  {
    if (typeof(T) == typeof(bool))
    {
      return true; // doesn't work
      return (T)(object)true; // works, but any way to avoid this?
    }

    return default(T);
  }
}
公共类TestClass
{
公共测试方法()
{
if(typeof(T)=typeof(bool))
{
return true;//不起作用
return(T)(object)true;//有效,但有什么方法可以避免这种情况吗?
}
返回默认值(T);
}
}

这是处理此处操作的唯一方法(返回特定封闭泛型类型的非默认值)。

将其设置为静态字段

public class TestClass<T>
{
  static T TrueIfBoolean = typeof(T) == typeof(bool) ? (T)(object)true : default(T)

  public T TestMethod()
  {
    return TrueIfBoolean;
  }
}
公共类TestClass
{
静态T TrueIfBoolean=typeof(T)==typeof(bool)?(T)(对象)true:默认值(T)
公共测试方法()
{
返回TrueIfBoolean;
}
}

这样,装箱/拆箱只发生一次。即使在初始代码中,这种优化也完全有可能由运行时完成。

泛型表示“同一代码适用于多种类型”。对于不同的类型,您需要不同的代码,因此您的用例不在泛型的关注范围内。如果您只是想检查方法主体中的类型,为什么要首先将其设置为泛型?是否.NET运行时没有对此进行优化?@dtb,@Servy:这类似于LINQ的
Cast(此IEnumerable源代码)
,但是有一些自定义情况,例如“Y”/“N”,需要手动转换为真/假。如果bool是我自己的类型,我可以使用显式运算符。所有其他类型都是泛型处理的。@TravisGockel:这很可能是真的,但它只能对泛型的
TestClass
版本执行。这是我的想法,因为编译时不知道T,但我想我会试试。:)我认为编译器不允许优化从值类型到
对象的转换。另一方面,如果演员阵容只发生一次,浪费的时间将是一个非因素。