接口中会声明C#内联方法吗?

Vic*_*aru 5 c# inline interface

如果我有一个界面:

 interface IMyInterface
 {
    void DoSomething();
 }
Run Code Online (Sandbox Code Playgroud)

还有一个实现类:

 class MyClass : IMyInterface
 {
     public void DoSomething()
     {

     }
 }
Run Code Online (Sandbox Code Playgroud)

DoSomething是否适合内联?我期望“否”,因为如果是接口,则该对象可能会转换为IMyInterface,因此实际调用的方法是未知的。但是,事实是它没有被标记为虚拟,这意味着它可能不在vtable上,因此如果将对象强制转换为MyClass,那么是否可以将其内联?

0b1*_*010 5

如果DoSomething直接调用,则它将是内联的候选对象(取决于该方法是否满足与大小等有关的其他内联条件)。

如果DoSomething通过接口调用,则不会内联。接口提供的间接导致需要vtable查找的虚拟调用,因此JIT编译器无法内联它,因为实际的调用站点仅在运行时解析。