C#无效自动ToString转换

时间:2015-12-17 17:56:02

标签: c# tostring implicit-conversion

在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对象不能隐式转换为字符串?

3 个答案:

答案 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;
    }
}