C#使自动ToString转换无效

本文关键字:转换 无效 ToString | 更新日期: 2023-09-27 18:27:09

在C#中,我有一个类:

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); 

我能在课堂上做些什么来使人与人之间的自动转换无效。ToString()并使编译器给出一个错误来指示Person对象不能隐式转换为字符串?

C#使自动ToString转换无效

我可以在课堂上做些什么来使从人与人之间。ToString()并使编译器向是否指示Person对象不能隐式转换为字符串?

你做不到,至少不容易。string+object的过载将是在object上发射ToString的过载,这是您无法控制的。这在规范的附加运算符(7.7.4)部分(重点矿)中有规定:

当一个或两个运算符同时出现时,binary+运算符执行字符串串联操作数的类型为字符串。如果字符串串联的操作数为null,则替换一个空字符串否则,任何非字符串通过调用从类型对象继承的虚拟ToString方法如果ToString返回null,则替换一个空字符串。

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

您必须编写一种编程语言,该语言不具有接受字符串和对象作为其两个操作数的+运算符重载。事实上,如果您使用的是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;
    }
}