【问题标题】:Method overriding in an inherited record继承记录中的方法覆盖
【发布时间】:2021-12-08 15:50:17
【问题描述】:

这是 C#10 中记录的预期行为吗?


Console.WriteLine(new Derived1()); // =output=> Derived1 { }
Console.WriteLine(new Derived2()); // =output=> Base

record Base
{
    public override string ToString() => "Base";
}

record Derived1 : Base;

record Derived2 : Base
{
    public override string ToString() => base.ToString();
}

【问题讨论】:

    标签: c# record c#-10.0


    【解决方案1】:

    是的,是的。编译器 will automatically generate 通过覆盖 ToString 为每条记录格式化显示:

    记录类型具有编译器生成的ToString 方法,该方法显示公共属性和字段的名称和值。 ToString 方法返回如下格式的字符串:

    <record type name> { <property name> = <value>, <property name> = <value>, ...}

    除非您自己覆盖它(就像您在 Derived2Base 中所做的那样)。

    查看sharplab.io的反编译。

    接下来还要注意:

    在 C# 10 及更高版本中,ToString 的实现可能包含 sealed 修饰符,这会阻止编译器为任何派生记录合成 ToString 实现。

    因此,如果您的基本实现足够,您可以将其密封以防止编译器生成覆盖:

    record Base
    {
        public sealed override string ToString() => "Base";
    }
    

    【讨论】:

    • 感谢您的回答。特别是对于sealed。所以我试图让这在意料之中,但你或其他人知道为什么决定这样做吗?对我来说,这听起来有点混乱和不便。
    • @AlexKovanev 您可以深入了解LDM notes。但我会说这样做是为了与其他方法保持一致。
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 2016-06-04
    • 2016-01-25
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多