Почему в этом случае мне не нужно преобразовывать int в строку?(.Сеть) - PullRequest
3 голосов
/ 25 сентября 2011
private void button2_Click(object sender, EventArgs e)
{
    int i = 5;
    MessageBox.Show(i);
}

Fails ..

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

Работает.Почему это?

Ответы [ 7 ]

3 голосов
/ 25 сентября 2011

Вторая версия преобразуется в вызов String.Concat, который принимает любые два объекта и возвращает строку.Это как если бы вы написали это:

MessageBox.Show(String.Concat("hoo", i));
3 голосов
/ 25 сентября 2011

MessageBox.Show() требует строку в качестве входного параметра.

Первый пример завершается ошибкой, поскольку неявное преобразование из целого числа в строку не выполняется.

Второй пример выполняется успешно, поскольку "hoo" + i оцениваетв строку.Это происходит потому, что язык C # определяет оператор сложения, который принимает string и object.object преобразуется в string путем вызова ToString().Этот оператор добавления строки всегда выбирается, когда один из операндов в добавлении является string.

2 голосов
/ 25 сентября 2011

Оператор + перегружен для System.String. Если один операнд является строкой, другой может быть любым объектом, и ToString () сначала будет вызываться для этого объекта.

Таким образом, при первом вызове результатом является целое число, которое не может быть неявно преобразовано в строку. Во втором вызове вызывается оператор +, и целое число преобразуется в строку, возвращаясь в строку.

Источник: Раздел 7.7.4 спецификации языка C #

2 голосов
/ 25 сентября 2011

Ваш первый фрагмент кода не работает по понятным причинам. Метод .Show ожидает строку, а вы передаете ей целое число.

Существует метод .ToString(), который вы можете использовать:

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

Теперь давайте рассмотрим следующий фрагмент:

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

это на самом деле переводится компилятором в:

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

, которая в основном является следующей .Concat перегрузкой, принимающей 2 объекта в качестве аргументов и возвращающей строку в качестве результата. И поскольку метод MessageBox.Show ожидает строку, он работает, так как это то, что возвращает метод .Concat, который я показал вам.

1 голос
/ 25 сентября 2011

Поскольку во втором примере ("hoo" + i) интерпретируется как строка, а в первом примере передается int в строковый параметр.Выполните этот код, чтобы доказать, что:

Console.WriteLine((5).GetType());
Console.WriteLine(("hoo" + 5).GetType());
0 голосов
/ 25 сентября 2011

MessageBox не знает, что делать с int в качестве аргумента в вашем первом фрагменте кода.Но скорее он ожидает строку, и строка может объединить это int с помощью оператора +.MessageBox.Show() может затем взять эту сцепленную строку и отобразить ее.

0 голосов
/ 25 сентября 2011

Метод MessageBox.Show() принимает параметр только строкового типа.В первом случае параметр имеет тип int, и не существует неявного преобразования между int и string.И код не компилируется.

Во втором случае int преобразуется в строку благодаря оператору +, определенному для string.Здесь используется для конкатенации - это работает таким образом, когда один из параметров для + имеет тип string.Таким образом, параметр автоматически преобразуется в string, и код работает.И результат string.

...