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