我们有两种描述通用方法的方法
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中不等效?