.net 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的子类中被重写)或者这种构造仅仅

在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
    的子类中被重写)或者这种构造仅仅是非法的(即带有
    .override
    的方法必须具有
    虚拟
    标志)

  • 我想知道规范的哪一部分回答了这些问题,因此我将来可以自己回答类似的问题(我在这里提问之前已经搜索了很多)。

    方法的标志在§23.1.10[MethodAttributes],作为
    VtableLayoutMask
    。当掩码应用于属性时,结果将是
    ReuseSlot
    NewSlot
    ReuseSlot
    对应于C#中的
    覆盖
    关键字,
    新闻批
    对应于缺少
    覆盖
    关键字或显式标记为
    新建

    隐藏和重写是不同的概念。例如,如果类
    X
    中的方法
    Foo
    重写了
    BaseX
    中同名的方法,则
    X.Foo
    也会隐藏
    BaseX

    现在来看看原始帖子中的两个具体问题:

  • 如果CIL定义未标记为
    newslot
    ,则如果方法
    B.M
    隐藏
    a.M
    ,则
    B.M
    也将覆盖
    a.M
    (第二部分,§10.3.1)

  • 第二部分第10.3.2条规定如下(重点):

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

    结合§15.4.2.2,显然
    .override
    指令只能引用明确标记为
    virtual
    的方法


  • 方法[MethodAttributes]的标志在§23.1.10中有描述,作为
    VtableLayoutMask
    。当掩码应用于属性时,结果将是
    ReuseSlot
    NewSlot
    ReuseSlot
    对应于C#中的
    覆盖
    关键字,
    新闻批
    对应于缺少
    覆盖
    关键字或显式标记为
    新建

    隐藏和重写是不同的概念。例如,如果类
    X
    中的方法
    Foo
    重写了
    BaseX
    中同名的方法,则
    X.Foo
    也会隐藏
    BaseX

    现在来看看原始帖子中的两个具体问题:

  • 如果CIL定义未标记为
    newslot
    ,则如果方法
    B.M
    隐藏
    a.M
    ,则
    B.M
    也将覆盖
    a.M
    (第二部分,§10.3.1)

  • 第二部分第10.3.2条规定如下(重点):

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

    结合§15.4.2.2,显然
    .override
    指令只能引用明确标记为
    virtual
    的方法