14

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

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”是一个接口,我可以在我的类中使用显式接口实现来做到这一点。

谢谢。

4

3 回答 3

13

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

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

于 2013-03-11T18:11:06.747 回答
9

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

public override string ToString()
{
    return FormatAddress();
}
于 2013-03-11T18:11:06.383 回答
0

大多。

通过使用这个 Roslyn 分析器,如我的问题的这个答案所示。

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

于 2019-01-24T21:08:38.607 回答