泛型struct .ToString()方法会导致装箱吗?

时间:2014-01-24 12:50:11

标签: .net boxing

以下代码

string GetString<T>( T? t ) where T : struct
{
  return t.HasValue ? t.Value.ToString() : null;
}

导致拳击,当它被调用的所有T都是枚举?

此方法具有以下IL代码(跳过方法的第一部分):

IL_0023:  constrained. !!T
IL_0029:  callvirt   instance string [mscorlib]System.Object::ToString()

我在这里看不到box操作。

1 个答案:

答案 0 :(得分:3)

不,它不会导致拳击。编译代码时,T的确切类型是已知的。

调用t.Value.ToString()不会导致该值被加框,就像调用42.ToString()不会将值设置为一样。

如果使用不可为空的值调用方法,它将被包装为可空,但这不是一种装箱形式,因为Nullable<T>类型不是对象。

请注意,IL代码不是最终代码。代码由JIT编译器从IL代码编译为本机代码,并且在该步骤之前可能不知道T的类型。