为什么 C# 编译器显式声明类型实现的所有接口?

发布于 2024-07-17 00:55:31 字数 709 浏览 5 评论 0原文

C# 编译器似乎明确记录了它及其基类实现的所有接口。 CLI 规范表明这不是必需的。 我见过一些其他编译器没有显式地发出这个,而且它似乎工作得很好。 C# 这样做有什么区别或原因吗?

底部的 C# 为 B 生成的 MSIL 是:

.class private auto ansi beforefieldinit B
       extends A
       implements IAdvanced,
                  ISimple

它不需要指定 ISimple,因为 A 与 IAdvanced 一样实现它。 C#代码:

interface ISimple {
    int Basic { get;  }
    int Zero { get;  }
}
interface IAdvanced : ISimple {
    string Major { get; }
}
class A : ISimple {
    int ISimple.Basic {
        get { return 1; }
    }
    int ISimple.Zero {
        get{ return 0;}
    }
}
class B : A, IAdvanced {
    string IAdvanced.Major {
        get { return "B"; }
    }
}

The C# compiler seems to explicitly note all interfaces it, and its base classes implement. The CLI specs say that this is not necesary. I've seen some other compilers not emit this explicitly, and it seems to work fine. Is there any difference or reason the C# does this?

The MSIL that the C# at the bottom generates for B is:

.class private auto ansi beforefieldinit B
       extends A
       implements IAdvanced,
                  ISimple

It shouldn't need to specify ISimple, because A implements it as does IAdvanced. C# code:

interface ISimple {
    int Basic { get;  }
    int Zero { get;  }
}
interface IAdvanced : ISimple {
    string Major { get; }
}
class A : ISimple {
    int ISimple.Basic {
        get { return 1; }
    }
    int ISimple.Zero {
        get{ return 0;}
    }
}
class B : A, IAdvanced {
    string IAdvanced.Major {
        get { return "B"; }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

笙痞 2024-07-24 00:55:32

我认为我们不能在这里知道任何明确的答案,除非我们让编译器开发人员介入。但是,我们可以猜测原因。 它可能是:

  1. 为了优化——也许它为 JIT 编译器节省了一些工作。
  2. 可读性 - 使人眼在查看 MSIL 输出时更容易掌握类型实现的内容。
  3. 因为这就是暑期实习生实施它的方式,而且它工作得很好,没有人会去改变它,以防万一它破坏了某些东西。

I don't think we can know any definitive answer here, unless we have the compiler developers drop in. However, we can guess about the reasons. It could be:

  1. for optimization - perhaps it saves some work for the JIT compiler.
  2. for readability - makes it easier for human eyes to grasp what a type implements when looking at the MSIL output.
  3. because that's how the summer intern implemented it and since it works fine, nobody is going to change it just in case it breaks something.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文