C# 记录在基记录中调用 ToString 而不是派生记录中的记录

C# record calls ToString in the base record instead of the one in the derived record

我有以下两条记录:

internal record Token
{
    private string content;

    public string Content
    {
        get => content;
        init => content = value ?? throw new ArgumentNullException(nameof(Content));
    }

    public int Position { get; init; }

    public Token(string content, int position)
    {
        Content = content ?? throw new ArgumentNullException(nameof(content));
        Position = position;
    }

    public override string ToString()
    {
        return Content;
    }

    public static implicit operator string(Token token)
    {
        return token.Content;
    }
}

internal record CommaToken : Token
{
    public CommaToken(int position) : base(",", position)
    {
    }
}

当我这样做时:

CommaToken comma = new(0);
Console.WriteLine(comma);

它只是输出这个:

,

根据文档,一条记录应该有一个编译器合成的 ToString 方法,除非定义了另一个具有相同签名的方法。在我的例子中,CommaToken 没有定义 ToString 方法,因此它应该使用自己合成的 ToString 而不是 Token 中的方法。我做错了什么?

原来Console.WriteLine也接受一个字符串,所以编译器决定用public static implicit operator string(Token token)CommaToken转换成字符串,这就导致了问题。
然后我了解到,如果转换将丢弃某种类型的信息,则转换运算符应标记为显式。在我的例子中,将 Token 转换为 string 会丢弃一些信息,因此转换运算符应标记为显式。