Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在这种情况下我不需要将int转换为string?(.Net)_.net_Messagebox - Fatal编程技术网

为什么在这种情况下我不需要将int转换为string?(.Net)

为什么在这种情况下我不需要将int转换为string?(.Net),.net,messagebox,.net,Messagebox,失败 private void button2_Click(object sender, EventArgs e) { int i = 5; MessageBox.Show(i); } 工作。为什么???MessageBox.Show()需要一个字符串作为其输入参数 第一个示例失败,因为没有从整数到字符串的隐式转换 第二个示例成功,因为“hoo”+i的计算结果为字符串。这是因为C语言定义了一个加法运算符,它接受字符串和对象。通过调用ToString(),将对象转换为字符串。当加

失败

private void button2_Click(object sender, EventArgs e)
{
    int i = 5;
    MessageBox.Show(i);
}
工作。为什么???

MessageBox.Show()
需要一个字符串作为其输入参数

第一个示例失败,因为没有从整数到字符串的隐式转换


第二个示例成功,因为
“hoo”+i
的计算结果为字符串。这是因为C语言定义了一个加法运算符,它接受
字符串
对象
。通过调用
ToString()
,将
对象转换为
字符串。当加法的一个操作数是
字符串时,总是选择此字符串加法运算符。由于明显的原因,您的第一个代码段不起作用。
.Show
方法需要一个字符串,而您正在传递一个整数

有一种方法可以使用:

private void button2_Click(object sender, EventArgs e)
{
    int i = 5;
    MessageBox.Show("hoo" + i);
}

现在让我们考虑下面的片段:

private void button2_Click(object sender, EventArgs e)
{
    int i = 5;
    MessageBox.Show(i.ToString());
}
编译器实际上将其转换为:

int i = 5;
MessageBox.Show("hoo" + i);

这基本上是以下重载,将2个对象作为参数,并返回字符串作为结果。因为
MessageBox.Show
方法需要一个字符串,所以它的工作原理就是我向您展示的
.Concat
方法返回的字符串。

第二个版本转换为对的调用,它接受任意两个对象并返回一个字符串。就好像你写过这样的话:

int i = 5;
MessageBox.Show(string.Concat("hoo", i));

因为在第二个示例中,
(“hoo”+i)
被解释为字符串,第一个示例将
int
传递给字符串参数。执行此代码以证明:

MessageBox.Show(String.Concat("hoo", i));
MessageBox.Show()
方法只接受字符串类型的参数。在第一种情况下,参数的类型为
int
,并且
int
string
之间没有隐式转换。而且代码不是可编译的


在第二种情况下,
int
由于为
string
定义了
+
运算符而被转换为string。此处用于连接-当
+
的一个参数的类型为
字符串时,它以这种方式工作。因此,参数将自动转换为
字符串
,代码将正常工作。结果是
string

MessageBox
不知道如何将
int
作为第一段代码中的参数。但是它需要一个字符串,并且该字符串可以通过运算符+将该int连接到自身。然后,
MessageBox.Show()

System.String的+运算符重载。如果一个操作数是字符串,另一个可以是任何对象,将首先对该对象调用ToString()

因此,在第一个调用中,结果是一个整数,不能隐式转换为字符串。在第二个调用中,调用+运算符,将整数转换为字符串,以字符串形式返回


来源:

@nawfal,我做错了什么?我已经解释了在第二种情况下,当您使用这个
+
操作符时会发生什么,以及它为什么工作。这不是你想知道的吗?为什么第二部有效而第一部无效?@David Heffernan,啊,是的,编辑部确实有效。重要的是你得到的最终产品的质量,而不是它是如何制造的:——)@Darin在这样一个C#问题中,如果你在头两分钟内没有得到投票,你的答案最终会从顶部往下拖4页,所以我理解这个过程@大卫·赫弗南我真的不在乎选票和声誉。我关心的是用高质量的答案为社区做出贡献。这是我唯一关心的事。好吧。事实上,我认为如果答案在最初的15分钟内隐藏起来(比如说)会更好,这样所有的宽限期编辑都可以在私下进行,人们可以给出一个格式良好的答案,而不会被淹没。你走得太快了。+运算符被转换为string.Concat()。它具有接受对象的重载。是的,我不知道C#中的确切术语。事实上,大卫的措辞是最准确的。.NET字符串类型没有加法运算符,但该语言提供了加法运算符。(请参阅我答案中的链接。)规范没有提到Concat,它只包含具有所有字符串或所有对象参数的重载。@HansPassant看到他们所说的与上面提到的David相同。是的,底层过程必须是string。Concat当然……呵呵,支持正确的答案可能很困难。喝杯啤酒,今天再次回答,晚安:)Concat的使用是一个实现细节,因此与代码编译的原因无关。这在语言规范中,根本没有提到Concat。
Console.WriteLine((5).GetType());
Console.WriteLine(("hoo" + 5).GetType());