在 CIL 中,缺少virtual关于继承(隐藏和覆盖)标志的虚方法的行为是什么?我搜索了ECMA335,但找不到预期行为的确切描述。
例如,让我们有基类A和子类B。
A包含一个M带有 flag的方法virtual,并且B包含一个M没有 flag的方法virtual,是B.M隐藏A.M还是覆盖它?A包含一个M带有标志的方法virtual,并且B包含一个M带有.override A.M标志但没有标志的方法virtual,则是virtual隐含的,B.M仅在此处是“虚拟的”(但是,例如,B.M不能在 的子类中被覆盖B)或者这种构造是否只是非法的(即方法.override 必须有virtual标志)?我想知道规范的哪一部分回答了这些问题,所以我将来可以自己回答类似的问题(在问这里之前我确实搜索了很多)。
该表示在 §23.1.10 Flags for methods [MethodAttributes] 中描述,如VtableLayoutMask。将掩码应用于属性时,结果将为ReuseSlot或NewSlot。ReuseSlot对应overrideC#中的关键字,NewSlot对应缺少override关键字或显式标记的方法new。
隐藏和覆盖是不同的概念。例如,如果Foo类中的X一个方法覆盖了 中的同名方法BaseX,那么X.Foo 也会隐藏BaseX。
现在针对原始帖子中的具体 2 个问题:
如果未标记 CIL 定义newslot,则如果方法B.M隐藏,A.M则B.M也将覆盖A.M。(第 II 部分,第 10.3.1 节)
第 II 部分第 10.3.2 节规定如下(强调我的):
其余信息指定提供实现的虚拟方法。
结合第 15.4.2.2 节,很明显该.override指令只能引用显式标记为 的方法virtual。