CIL中非虚方法的继承行为

时间:2013-04-16 14:22:11

标签: .net cil

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

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

  1. 如果A包含带有标记M的方法virtual,并且B包含没有标记M的方法virtual,则B.M隐藏A.M还是会覆盖它?
  2. 如果A包含带有标记M的方法virtual,并且B包含M方法.override A.M,但没有virtual标记为virtualB.M暗示,B.M“虚拟”仅在此处显示(但是,B无法在.override的子类中覆盖)或者这种结构是非法的(即virtual 的方法必须有{{1}}标志?)
  3. 我想知道规范的哪些部分回答了这些问题,所以我将来能够自己回答类似的问题(在此之前我已经搜索了很多)。

1 个答案:

答案 0 :(得分:4)

表示在方法[MethodAttributes]的§23.1.10标志中描述为VtableLayoutMask。将蒙版应用于属性后,结果将为ReuseSlotNewSlotReuseSlot对应于C#中的override关键字,NewSlot对应于缺少override关键字或明确标有new的方法。

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

现在针对原帖中的具体2个问题:

  1. 如果CIL定义未标记为BaseX,则如果方法newslot隐藏B.M,则A.M也会覆盖B.M。 (分区II,§10.3.1)

  2. 分区II,§10.3.2陈述以下内容(强调我的):

      

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

    结合§15.4.2.2,很明显A.M指令只能引用明确标记为.override的方法。