为什么struct用泛型装箱

时间:2018-09-03 09:17:50

标签: c# cil boxing

我们有两种描述通用方法的方法

public static void DoWithBoxing<T>(IStructInterface<T> @struct)
{
    @struct.SomeMethod();
}    
public static void DoWithoutBoxing<T>(T @struct) where T : IStructInterface<T>
{
    @struct.SomeMethod();
}

编译器生成如下:

IL_0003: initobj ConsoleApp1.MyStruct
// DoWithoutBoxing(myStruct);
IL_0009: ldloc.0
IL_000a: call void ConsoleApp1.Program::DoWithoutBoxing<valuetype ConsoleApp1.MyStruct>(!!0)
// (no C# code)
IL_000f: nop
// DoWithBoxing(myStruct);
IL_0010: ldloc.0
IL_0011: box ConsoleApp1.MyStruct
IL_0016: call void ConsoleApp1.Program::DoWithBoxing<valuetype ConsoleApp1.MyStruct>(class ConsoleApp1.IStructInterface`1<!!0>)

在方法DoWithBoxing中生成操作码

IL_0003: constrained. !!T

为什么这些方法在IL中不等效?

0 个答案:

没有答案