为什么接口在 IL 级别作为 "abstract interface" 发出?

Why does an interface get emitted at the IL level as an "abstract interface"?

我一直在尝试了解有关 CLR 的更多信息,同时注意到 C# 中的以下接口将被编译为包含某种 "abstract interface".

的 IL

鉴于在 C# 中将接口声明为抽象接口是无效的,那么在 IL 级别允许抽象接口意味着什么?最初我想知道这是否是运行时在内部表示接口的方式,通过声明抽象 class 从而防止它被更新。

它似乎确实遵循了这个想法,如 .class 所示。然而,紧随其后的是interface。因此,当运行时似乎已经支持接口的概念时,需要实际创建抽象 class 的想法似乎没有实际意义。

这让我想到了几个问题:

  1. 抽象接口的用途是什么,为什么抽象接口在 IL 级别有效?
  2. 为什么 .class interface 是必要的,为什么这在 IL 级别有效?
  3. 如果运行时支持接口的概念,为什么还需要 .classabstract

C#:

public interface IExample
{
    void SomeMethod(int number);
}

IL:

.class interface public auto ansi abstract IExample
{
    // Methods
    .method public hidebysig newslot abstract virtual 
        instance void SomeMethod (
            int32 number
        ) cil managed 
    {
    } // end of method IExample::SomeMethod

}

如果您查看 metadata (PDF) 在 IL 级别的定义方式,所有 类型由 .class header(偶数值类型)。

interface 被描述为 "Type semantic attribute" (10.1.3),用于区分所定义的是否确实是接口,而不是抽象 class 其中所有成员都是抽象的。

abstract 被描述为 "Inheritance attribute" (10.1.4),具体表示类型无法实例化。

这涵盖了预期的含义。至于为什么它们是 necessary(即为什么 interface 不会自动 imply abstract),我相信完成此级别的所有内容 explicit。由于您不必经常自己编写 IL,因此在这些标志之间有一些重叠是无害的。