以下代码
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
操作。
答案 0 :(得分:3)
不,它不会导致拳击。编译代码时,T
的确切类型是已知的。
调用t.Value.ToString()
不会导致该值被加框,就像调用42.ToString()
不会将值设置为一样。
如果使用不可为空的值调用方法,它将被包装为可空,但这不是一种装箱形式,因为Nullable<T>
类型不是对象。
请注意,IL代码不是最终代码。代码由JIT编译器从IL代码编译为本机代码,并且在该步骤之前可能不知道T
的类型。