是否可以禁用隐式ToString()调用?

时间:2013-03-11 18:08:37

标签: c#

我想知道是否有办法为此代码获取编译错误:

var customer = new SomeCustomerClass();
Console.WriteLine("Customer address:" + customer);

所以我将被迫写下这样的东西:

var customer = new SomeCustomerClass();
Console.WriteLine("Customer address:" + customer.FormatAddress());
Console.WriteLine("Customer accounts:" + customer.FormatAccounts());

如果“ToString”是一个接口,我可以使用我班级中的显式接口实现来做到这一点。

感谢。

3 个答案:

答案 0 :(得分:12)

在编译时无法阻止此代码。 Object.ToString是每个对象的公共契约的一部分,并且没有办法阻止它在编译时被调用。在这种特殊情况下,编译器会将+解析为String.Concat(object, object),并且实现最终会调用Object.ToString。没有办法改变这一点。我认为您最顺畅的前进道路是覆盖ToString,并将其调入FormatAddress

请不要像其他一些人所暗示的那样更改ToString以引发异常。大多数.Net期望ToString存在并且不会抛出。更改它会对程序产生许多意外的负面影响(包括终止这些对象的调试体验)

答案 1 :(得分:9)

您可以在客户类中覆盖ToString,如果需要,可以在那里调用FormatAddress方法。

public override string ToString()
{
    return FormatAddress();
}

答案 2 :(得分:0)

主要是

通过使用this Roslyn Analyzer中的this answer来解决我的问题。

如果您觉得它有用,请在此处对原始答案的贡献者进行投票。