【问题标题】:C# + Operator defaults to string + objectC# + 运算符默认为字符串 + 对象
【发布时间】:2024-04-27 21:00:02
【问题描述】:

我注意到在 C# 中 + 运算符在左侧接受一个字符串,在右侧接受一个对象:

string output = "" + numbers.ElementAt(0); 
//vs
string output = numbers.ElementAt(0).ToString();

为什么默认行为是接受右侧的对象而不是字符串?当我在其他 + 运算符中查找说 int 时,它是 int/int 而不是 int/object 的强类型。

我知道在 C# 中所有对象都有 ToString() 方法,这只是在上面的第一个示例中无需调用 .ToString() 的一种方法吗?

【问题讨论】:

    标签: c# operator-keyword


    【解决方案1】:

    为什么默认行为是接受右边的对象而不是字符串?

    嗯,首先,一个接受两个字符串的重载,如果你传递两个字符串,那就是要使用的重载,所以它是默认行为。但是如果你传递一个字符串和一个非字符串,那么将使用 (string, object) 重载。

    至于为什么会出现这种重载,这是因为 C# 语言设计者认为将字符串连接到任何对象是完全明智的,并且对于任何类型的对象都有一个合理的实现方法.

    当我在其他 + 运算符中查找说 int 时,它是 int/int 而不是 int/object 的强类型。

    您将如何实现operator +(int, object) 重载?与字符串连接不同,我在这里没有看到任何好的实现。

    我知道在 C# 中所有对象都有 ToString() 方法,这只是在上面的第一个示例中无需调用 .ToString() 的一种方法吗?

    如果对象为空,它实际上可以工作,而您的解决方案则不能。如果你会考虑到这一点,那么是的,这基本上就是重载所做的一切。

    【讨论】:

      【解决方案2】:

      这只是在上面的第一个示例中无需调用 .ToString() 的一种方法

      是的。

      【讨论】:

        【解决方案3】:

        字符串连接自动将非字符串转换为字符串。

        来源:C# Language Specification: Addition operator, MSDN

        【讨论】:

          最近更新 更多