调用抽象静态函数时,call opcode前为何存在.constrained前缀?
关于C#静态抽象方法调用的IL指令疑问
C#代码示例
public interface ITestable { public abstract static void Test(); } public class MyTester<T> where T : ITestable { public void RunTest() { T.Test(); } }
编译上述代码后,MyTester<T>.RunTest()对应的IL指令如下:
IL_0000: constrained. !T IL_0006: call void ITestable::Test() IL_000b: ret
根据微软文档,constrained前缀仅能出现在callvirt指令前,但此处它却位于call指令前。该前缀在JIT编译后的汇编代码中也有体现,会在调用Test函数前执行检查。我原本认为静态抽象方法调用应编译为简单的call指令,不解为何要采用这种复杂的实现方式。
内容的提问来源于stack exchange,提问作者Tacodiva
相关产品推荐
相关产品推荐

