Почему это добавляет 10 ко всем элементам в моем списке C#? - PullRequest
0 голосов
/ 08 апреля 2020

Привет, привет, я новичок в C#, и мне было просто интересно, почему это печатает 1 перед всеми элементами в моем списке. enter image description here

using System.Collections.Generic;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> primes = new List<int> { 4, 5, 6 };
            for (int i = 0; i < primes.Count; i++)
            {
                int prime = primes[i];
                Console.WriteLine(prime + '\n');
            }
        }
    }
}

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Из-за двоичного числа c продвижения , происходящего с использованием предопределенного оператора + в prime + '\n', оба операнда будут преобразованы в тип int. Второй операнд, '\n', становится 10 при преобразовании в int. Таким образом, ваше выражение имеет эффект добавления 10 к каждому значению prime, как если бы вы написали ...

Console.WriteLine(prime + 10);

Поскольку вы используете Visual Studio, есть пара быстрых способы наблюдать, какие решения принимает компилятор. Во-первых, наведите курсор мыши на оператор +, который показывает это всплывающее окно IntelliSense QuickInfo ...

IntelliSense QuickInfo popup when hovering over the +(int, int) operator in Visual Studio 2019

Там вы видите, что выполняется добавление int, которое занимает два int с и возвращает int. Другой - навести указатель мыши на WriteLine, что показывает это всплывающее окно QuickInfo ...

IntelliSense QuickInfo popup when hovering over the Console.WriteLine(int) method in Visual Studio 2019 Там вы можете видеть, что он выбирает перегрузку Console.WriteLine(), которая принимает один int параметр, потому что результатом prime + '\n' является int.

Также обратите внимание, что вам не нужно добавлять '\n' при вызове WriteLine() (выделение Line) потому что это сделано для вас. Сравните этот метод с Console.Write().

1 голос
/ 08 апреля 2020

В Console.WriteLine методе у вас есть prime + '\n' выражение. Первый операнд в этом выражении слева от оператора + имеет тип prime и имеет тип int. Второй операнд '\n' имеет тип char.

char тип и int тип классифицируются в C# как целочисленные типы , что в основном означает, что char также целое число. Существует неявное преобразование из типа char в тип int, что означает, что тип char будет преобразован в тип int, если есть такая возможность и необходимость в выражении.

Есть два вопроса :

  • Почему тип char неявно преобразуется в тип int в prime + '\n' выражении?
  • Почему выражение prime + '\n' добавляет значение 10 на prime?

Ответ на первый вопрос заключается в том, что эта перегрузка оператора + принимает два операнда типа int. Нет перегрузки оператора +, который принимает один операнд типа int, а другой - char, несмотря на порядок операндов. Поэтому операнд типа char будет неявно преобразован в тип int. Даже если вы явно напишите, что операнд типа int должен трактоваться как тип char путем записи (char)prime, результат будет таким же, потому что нет перегрузки операнда +, который принимает два операнда типа char и оба операнда будут неявно преобразованы в тип int.

Ответ на второй вопрос заключается в том, что целочисленное значение символа '\n' равно 10 . Вы можете прочитать больше об этом в UTF-16 статье.

Вы можете сделать две вещи:

  1. Удалить символ '\n' из Console.WriteLine, потому что этот метод уже устанавливает новую строку в конце строки.
  2. Используйте Console.Write и вместо символа '\n' используйте строку, содержащую только этот символ, "\n", поэтому строка будет выглядеть следующим образом: Console.WriteLine(prime + "\n");. На этот раз будет использоваться перегруженный оператор +, который принимает операнд типа object и операнд типа string. Операнд типа object, в данном случае prime, будет неявно преобразован в тип string, и эти две строки будут объединены.
0 голосов
/ 08 апреля 2020

при вызове WriteLine() вам не нужно добавлять \n, теперь ошибка в том, что вы печатаете \n как символ (одинарные кавычки), а не как строку (двойные кавычки), которая преобразуется в int и имеет значение 10

вы можете попробовать

Console.WriteLine((int)'\n');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...