c# - 为什么接口(interface)在 IL 级别作为 "abstract interface"发出?

标签 c# .net clr roslyn cil

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

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

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

这引出了几个问题:

  1. 抽象接口(interface)的用途是什么,为什么抽象接口(interface)在 IL 级别有效?
  2. 为什么 .class interface 是必需的,为什么这在 IL 级别有效?
  3. 如果运行时支持接口(interface)的概念,为什么还需要 .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 被描述为“类型语义属性”(10.1.3),用于区分所定义的是否确实是一个接口(interface),而不是一个抽象类,其中所有成员都是抽象的。

abstract 被描述为“继承属性”(10.1.4),具体表示类型无法实例化。

这涵盖了预期的含义。至于为什么它们是必要的(即为什么interface 不会自动imply abstract),我相信这样做是为了让这个级别的所有内容都明确。由于您不必经常自己编写 IL,因此这些标志之间的某些重叠是无害的。

关于c# - 为什么接口(interface)在 IL 级别作为 "abstract interface"发出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44432846/

相关文章:

c# - ASP.NET MVC4 + Razor on Mono + EF 6 DateTime 崩溃

c# winforms - DataGridView 重新加载后保存位置

c# - typescript 升级 1.8.10 到 2.9.2 和 4.6.4 构建错误

c# - 在 API REST .NET 中从 NLog 读取 NLog.config

c# - 使用泛型转换代码

javascript - 将坐标从 EPSG 3857 转换为 4326

c# - 如何在 GeckoFX 29 中处理下载

.net - 如何获取 CLR 加载的类型列表?

c# - CLR在哪里存储一种类型实例的方法

.net - VS2008 - 为版本号添加字母(即 1.1.1.12-Dev)