Консоль, отображающая char как int при использовании условного оператора (?:) - PullRequest
0 голосов
/ 02 ноября 2018

Я удивлен выводом следующего кода

public static void Main(string[] args)
{
    char x = 'A';
    int i = 0;
    Console.WriteLine (true  ? x : 0);
    Console.WriteLine(false ? i : x); 
}

Когда я читал вопрос об интервью на C #, я увидел этот код, и результат вышеприведенного кода был

Выход

65
65

Мне интересно, как это происходит.

Кто-нибудь может мне объяснить? Спасибо!

1 Ответ

0 голосов
/ 02 ноября 2018

'A' является char и имеет значение 65

Однако есть техническое объяснение того, почему это приводит к целому числу (а не к строковому представлению символа), его можно найти в спецификациях ECMA C #

12.15 Условный оператор

Второй и третий операнды x и y оператора?: управляют тип условного выражения.

  • Если x имеет тип X, а y имеет тип Y, тогда
    • Если X и Y одинакового типа, то это тип условного выражения.
    • В противном случае, если неявное преобразование (§11.2) существует из X в Y, но не из Y в X, тогда Y является типом условного выражения.
    • В противном случае, если неявное преобразование перечисления (§11.2.4) существует из X в Y, тогда Y является типом условного выражения.
    • В противном случае, если неявное преобразование перечисления (§11.2.4) существует из Y в X, тогда X является типом условного выражения.
    • В противном случае, если неявное преобразование (§11.2) существует из Y в X, но не из X в Y, тогда X является типом условного выражения.
    • В противном случае тип выражения не может быть определен и возникает ошибка времени компиляции.
  • Если только один из x и y имеет тип, и оба x и y неявно преобразуются в этот тип, то это тип условного выражение.
  • В противном случае тип выражения не может быть определен, и возникает ошибка времени компиляции
* ** 1045 1046 * Пример * ** 1047 1048 *
char Y = 'A';
int X = Y;
Y = X; // compiler error

Короче говоря, не существует неявного преобразования из int в char, но есть от char до int, поэтому имеет смысл, чтобы тип результата был int

...