分配泛型类型时C#会发出box / unbox吗?

时间:2016-04-22 09:26:06

标签: c# boxing generic-constraints

我偶然发现了以下样本发出的奇怪的IL代码:

class Sample
{
    void Foo<T,U>(T t, U u) where U : T { t = u; }
}

为Foo的身体发射的IL是

IL_0001: ldarg.2      // u
IL_0002: box          !!1/*U*/
IL_0007: unbox.any    !!0/*T*/
IL_000c: starg.s      t

所以我的问题:为什么它会发出拆箱/装箱操作?我会想象对话永远不需要任何拳击,因为它无论是首先是引用类型还是相同的数据类型。

即使我明确地说类型参数是引用类型,即使是更奇怪的,它也不会以任何方式改变发出的代码:

class Sample
{
    void Foo<T, U>(T t, U u) where U : class, T where T : class { t = u; }
}

(IL输出相同)

那么......为什么?

1 个答案:

答案 0 :(得分:1)

T可以是引用类型(界面,objectSystem.ValueType),而U是结构,例如

Foo<IConvertible, int>(1, 2);
Foo<object, int>("foo", 2);