1 +“2”在 C# 中如何工作

Ama*_*har -1 c# operators type-safety

我正在阅读有关 C# 中的类型安全的内容,例如我们如何不能将整数值分配给 bool 等,这让我做了一些实验。

我执行了一个代码片段,希望它会给出编译时错误,但它有效并提供了结果。

var add = 1 + "2"; // it gave 12 as result in C#
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果我的理解不正确,请纠正我,并请分享任何简要解释这一点的文档链接。

Swe*_*per 6

之所以能够编译,是因为+声明了一个运算符,该运算符将 anyobject作为第一个参数,将 astring作为第二个参数。

语言规范说:

下面列出了预定义的加法运算符。对于数字和枚举类型,预定义的加法运算符计算两个操作数的总和。当一个或两个操作数的类型为 时string,预定义的加法运算符会连接操作数的字符串表示形式。

[...]

字符串连接:

string operator +(string x, string y);
string operator +(string x, object y);
string operator +(object x, string y);
Run Code Online (Sandbox Code Playgroud)

二元+运算符的这些重载执行字符串连接。如果字符串连接的操作数为null,则替换为空字符串。否则,string通过调用从类型对象继承的虚拟方法,任何非操作数都将转换为其字符串表示形式ToString。如果ToString返回null,则替换为空字符串。

在您的情况下,运算符重载决策将选择上面列表中的第三个重载。它相当于1.ToString() + "2".