繁体   English   中英

C#使自动ToString转换无效

[英]C# Invalidate automatic ToString 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); 

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

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

您不能,至少不能以简单的方式。 string + object的重载将是在object上发出ToString的重载,您无法对其进行控制。 这在规范的“ 加法运算符(7.7.4)”部分(强调我的)中指定:

当一个或两个操作数的类型为string时,binary +运算符将执行字符串连接。 如果字符串连接的操作数为null,则替换为空字符串。 否则,通过调用从类型对象继承的虚拟ToString方法,将任何非字符串参数转换为其字符串表示形式。 如果ToString返回null,则替换为空字符串。

您可以执行的操作(不是编译时警告)是从重载的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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM