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
会丢弃一些信息,因此转换运算符应标记为显式。
我有以下两条记录:
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
会丢弃一些信息,因此转换运算符应标记为显式。