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对象不能隐式转换为字符串?
我可以在课堂上做些什么来使从人与人之间。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;
}
}