1

virtual在 CIL 中,在继承(隐藏和覆盖)方面缺少标志的虚拟方法的行为是什么?我搜索了ECMA335,但找不到预期行为的确切描述。

例如,让我们有基类A和子类B

  1. 如果A包含M带有标志的方法virtual,并且B包含M不带标志的方法virtual,将B.M隐藏A.M还是覆盖它?
  2. 如果A包含一个M带有标志的方法virtual,并且B包含一个M带有.override A.M标志但没有标志的方法virtual,那么是virtual隐含的,B.M仅在此处是“虚拟的”(但是,B.M不能在 的子类中被覆盖B)或者这种构造只是非法的(即.override 必须virtual标志的方法)?

我想知道规范的哪些部分回答了这些问题,所以我将来可以自己回答类似的问题(在问这里之前我确实搜索了很多)。

4

1 回答 1

5

该表示在方法 [MethodAttributes] 的 §23.1.10 标志中进行了描述,如VtableLayoutMask. 将掩码应用于属性时,结果将为ReuseSlotNewSlotReuseSlot对应overrideC#中的关键字,NewSlot对应缺少override关键字或显式标记的方法new

隐藏和覆盖是不同的概念。例如,如果Foo类中X的方法覆盖 中的同名方法BaseX,则X.Foo 隐藏BaseX

现在对于原始帖子中的具体2个问题:

  1. 如果 CIL 定义没有被标记newslot,那么如果一个方法B.M隐藏A.MthenB.M也将被覆盖A.M。(第二部分,§10.3.1)

  2. 第二部分,§10.3.2 陈述如下(强调我的):

    其余信息指定提供实现的虚拟方法

    结合§15.4.2.2,很明显该.override指令只能引用显式标记的方法virtual

于 2013-04-16T15:31:34.817 回答