.net CIL中非虚方法的继承行为
在CIL中,对于继承(隐藏和重写),缺少标志.net CIL中非虚方法的继承行为,.net,cil,.net,Cil,在CIL中,对于继承(隐藏和重写),缺少标志virtual的虚拟方法的行为是什么?我搜索了一遍,但找不到对预期行为的准确描述 例如,让我们使用基类A和子类B 如果A包含带有virtual标志的方法M,而B包含不带virtual标志的方法M,则B.M会隐藏A.M还是会覆盖它 如果A包含带有virtual标志的方法M,而B包含带有标志的方法M。覆盖A.M,但不带virtual,则virtual是隐含的,而B.M仅在此处为“virtual”(但是,比方说,B.M不能在B的子类中被重写)或者这种构造仅仅
virtual
的虚拟方法的行为是什么?我搜索了一遍,但找不到对预期行为的准确描述
例如,让我们使用基类A
和子类B
A
包含带有virtual
标志的方法M
,而B
包含不带virtual
标志的方法M
,则B.M
会隐藏A.M
还是会覆盖它A
包含带有virtual
标志的方法M
,而B
包含带有标志的方法M
。覆盖A.M
,但不带virtual
,则virtual
是隐含的,而B.M
仅在此处为“virtual”(但是,比方说,B.M
不能在B
的子类中被重写)或者这种构造仅仅是非法的(即带有.override
的方法必须具有虚拟
标志)我想知道规范的哪一部分回答了这些问题,因此我将来可以自己回答类似的问题(我在这里提问之前已经搜索了很多)。方法的标志在§23.1.10[MethodAttributes],作为
VtableLayoutMask
。当掩码应用于属性时,结果将是ReuseSlot
或NewSlot
ReuseSlot
对应于C#中的覆盖
关键字,新闻批
对应于缺少覆盖
关键字或显式标记为新建
隐藏和重写是不同的概念。例如,如果类X
中的方法Foo
重写了BaseX
中同名的方法,则X.Foo
也会隐藏BaseX
现在来看看原始帖子中的两个具体问题:
newslot
,则如果方法B.M
隐藏a.M
,则B.M
也将覆盖a.M
(第二部分,§10.3.1).override
指令只能引用明确标记为virtual
的方法方法[MethodAttributes]的标志在§23.1.10中有描述,作为
VtableLayoutMask
。当掩码应用于属性时,结果将是ReuseSlot
或NewSlot
ReuseSlot
对应于C#中的覆盖
关键字,新闻批
对应于缺少覆盖
关键字或显式标记为新建
隐藏和重写是不同的概念。例如,如果类X
中的方法Foo
重写了BaseX
中同名的方法,则X.Foo
也会隐藏BaseX
现在来看看原始帖子中的两个具体问题:
newslot
,则如果方法B.M
隐藏a.M
,则B.M
也将覆盖a.M
(第二部分,§10.3.1).override
指令只能引用明确标记为virtual
的方法