gpt4 book ai didi

c# - 使用不同名称重写最终 (IL)/密封 (C#) 方法是否合法?

转载 作者:行者123 更新时间:2023-12-03 22:58:07 25 4
gpt4 key购买 nike

我有一个类层次结构:

class C1 { virtual object M1(); }

class C2: C1 { override sealed object M1(); }

class C3: C2 {
// I want to override M1()
// CSC gives me an error, obviously
override object M1();
}

不过看来还是有办法的。在 IL 中,您可以使用不同的名称覆盖方法。因此,我们更改名称(M1_2() 覆盖 M1()),假设它覆盖基类上的方法 (C1::M1()),la显式接口(interface)实现,并且中间(C2)类上的“final”不再重要。

.class public auto ansi beforefieldinit N.C3
extends N.C2
{
.method private hidebysig virtual final
instance object M1_2() cil managed
{
.override N.C1::M1

ILasm 会很高兴地组装它,并在 ILSpy 中显示为

public class C3 : C2
{
object C1.M1_2()

然后在同一个类中,您可以定义一个调用 this.M1_2()new M1。所以你有1)重写的M1(具有不同的名称,但仍然......)和2)在C3中有一个M1方法(它是一个“桥”,但这就是你所看到的)。

但看起来...错误。还是合法的?

如果你打电话

C1 obj = new C3();
obj.M1();

然后M1_2被正确调用(我在调试器中验证了它)。看来,只有当链是直接的 (C1::M1 > C2::M1 > C3::M1) 时,CLR 才会强制执行 final 约束,而如果您这样做,则不会“跳转”层次结构 (C1::M1 > C3::M1_2)。不过,您必须选择不同的名称。如果您使用相同的名称 (M1):

.class public auto ansi beforefieldinit N.C3
extends N.C2
{
.method private hidebysig virtual final
instance object M1() cil managed
{
.override N.C1::M1

将不起作用,抛出System.TypeLoadException

Additional information: Declaration referenced in a method implementation cannot be a final method Which is totally expected.

我想知道:这些是 CLR 规则,还是我只是在实现中发现了一个极端情况? (规则中的极端情况很好,但在实现中......你不能指望它;))

最佳答案

看起来像是规范中的边缘情况。

在 ECMA-335,第 II 部分第 22.27 节 MethodImpl 中:

  1. MethodDeclaration shall index a method in the ancestor chain of Class (reached via its Extends chain) or in the interface tree of Class (reached via its InterfaceImpl entries) [ERROR]

  2. The method indexed by MethodDeclaration shall not be final (its Flags.Final shall be 0) [ERROR]

因此,您尝试重写的特定方法不得被密封,并且必须在祖先类上定义,但不要求指定的特定方法是祖先链中该槽的最特定重写。

话虽如此, future 版本可能会强加安全限制来执行此类操作,这可能是“完全出乎意料的”。

关于c# - 使用不同名称重写最终 (IL)/密封 (C#) 方法是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33945666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com