C# 使自动 ToString 转换无效

C# Invalidate automatic ToString conversion

在 C# 中,我有一个 class:

public class Person
{
    public string name;
    public int id;
}

目前,当我这样做时:

Person person = new Person
{
    name = "John",
    id = 3
}
// Will be converted Console.Writeline("Person = " + person.ToString()); by the compiler
Console.Writeline("Person = " + person); 

我可以在 class 中做什么来使从 person 到 person.ToString() 的自动转换无效并使编译器给出一个错误来指示 Person 对象不能隐式转换为字符串?

What can I do in the class to invalidate the automatic conversion from person to person.ToString() and make the compiler give an error to indicate Person object cannot be converted to string implicitly?

你不能,至少不能以简单的方式。 string + object 的重载将是在 object 上发出 ToString 的那个,你无法控制。这在规范的 Addition Operator (7.7.4) 部分中指定(强调我的):

The binary + operator performs string concatenation when one or both operands are of type string. If an operand of string concatenation is null, an empty string is substituted. Otherwise, any non-string argument is converted to its string representation by invoking the virtual ToString method inherited from type object. If ToString returns null, an empty string is substituted.

您可以做的不是编译时警告,而是从重载 ToString 中抛出异常。我肯定会建议不要那样做。您可以编写一个 Roslyn 分析器来查找传递给 Console.WriteLine 的任何对象,而不覆盖 ToString 方法并为此发出警告。

您编写的编程语言必须不重载接受字符串和对象作为其两个操作数的 + 运算符。实际上,如果您使用的 C# 声明这样的运算符重载 是语言规范 的一部分,那么您显示的代码 必须 在 C# 中编译。为了使该操作无法编译,需要使用不符合 C# 语言规范的语言。

在覆盖 ToString 方法并将其标记为过时时使用 new 关键字看起来可以解决问题。

public class Person
{
    public string name;
    public int id;

    [Obsolete("this should not be used", true)]
    public new string ToString()
    {
        return null;
    }
}