int没有显式转换的字符串?

Ton*_*ony 6 c# tostring

我有一个简单的问题,但我很惊讶.

此代码有效:

int itemID = 1;
string dirPath = @"C:\" + itemID + @"\abc";
Run Code Online (Sandbox Code Playgroud)

itemID.ToString()在这种情况下我为什么不这么做?

Cla*_*ies 13

来自MSDN

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

根据其他答案中的一些评论,扩展我的答案...

这个过程不仅仅是"语法糖"或方便.它是一个名为Operator Overloading的核心C#语言特性的结果.在+运算符和String +重载的情况下,提供重载作为抽象String类的内部的手段,这是良好设计原则的核心基础.+ String Overload通过确保它永远不返回空值来提供类型安全性,而是为任何无法使用该.ToString()方法转换的操作数返回空字符串.但是,即使是自定义复杂类型(不仅仅是基元)也可以添加到字符串中,假设它们有.ToString()重载,而不知道任何不同的String类型的实现.

运算符重载是一种主要的语言功能,更多人应该学会利用它的强大功能.


Hab*_*bib 8

+在字符串连接中转换为string.Concat调用,在内部调用ToString每个对象的无参数.

string.Concate方法 - MSDN

该方法通过调用该对象的无参数ToString方法来连接args中的每个对象; 它不会添加任何分隔符.

编辑:

这是ILSpy中的样子 在此输入图像描述


Ser*_*rvy 6

+运算符有许多重载.其中三个如下:

operator +(字符串a,字符串b)

operator +(字符串a,对象b)

operator +(对象a,字符串b)

您的代码正在使用运算符的第二个重载.

在确定为匹配后,该运算符将其转换为调用string.Concat,该调用可以将任意数量的对象(类型object)作为其参数.

在定义中string.Concat,它将调用ToString所有参数(在首先检查它们之后)以获取它们的字符串值,这就是将要连接的内容.

由于所有这些,您始终可以使用字符串连接任何对象,并且它将使用该对象的ToString方法进行编译和执行.