在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对象不能隐式转换为字符串?
答案 0 :(得分:7)
我可以在课堂上做什么来使自动转换无效 person to person.ToString()并使编译器给出错误 表示Person对象无法隐式转换为字符串?
你不能,至少不是一个简单的方法。 string
+ object
的重载将是ToString
object
的重载,您无法控制。这在规范的Addition Operator (7.7.4)部分中指定(强调我的):
binary +运算符在一个或两个时执行字符串连接 操作数是字符串类型。如果字符串连接的操作数是 null,替换空字符串。 否则,任何非字符串 通过调用,将参数转换为其字符串表示形式 从类型对象继承的虚拟ToString方法。如果是ToString 返回null,替换为空字符串。
您可以执行的操作(不是编译时警告)会从重载的ToString
中引发异常。我肯定会建议不要那样做。您可以编写一个Roslyn分析器,查找传递给Console.WriteLine
的任何对象,而不会覆盖ToString
方法并发出警告。
答案 1 :(得分:1)
你必须编写你的编程语言没有+运算符的重载接受一个字符串和一个对象作为它的两个操作数。实际上,如果你正在使用C#来声明这样的运算符重载是语言规范的一部分,那么你显示的代码必须编译在C#中。为了使该操作不能编译,需要使用不符合C#语言规范的语言。
答案 2 :(得分:-1)
在重写ToString方法并将其标记为过时时使用new关键字看起来可以解决问题。
public class Person
{
public string name;
public int id;
[Obsolete("this should not be used", true)]
public new string ToString()
{
return null;
}
}