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



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

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

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

这让我想到了几个问题:

抽象接口
  1. 的用途是什么,为什么抽象接口在 IL 级别有效?
  2. 为什么.classinterface是必要的,为什么这在 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
}

如果您查看元数据 (PDF) 在 IL 级别是如何定义的,所有类型都是.class标头引入的(甚至是值类型)。

interface被描述为"类型语义属性"(10.1.3),用于区分所定义的是否确实是一个接口,而不是一个抽象类,其中所有成员都是抽象的。

abstract被描述为"继承属性"(10.1.4),具体意味着无法实例化类型。

这涵盖了预期的含义。至于为什么它们是必要的(即为什么interface不会自动暗示abstract),我相信这样做是为了在这个层面上明确所有内容。由于您通常不必自己编写 IL,因此其中一些标志之间存在一些重叠是无害的。

相关内容

  • 没有找到相关文章

最新更新