Поведение троичного оператора в C# - PullRequest
0 голосов
/ 29 февраля 2020

Я недавно наткнулся на строки кода ниже.

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

Насколько мне известно, приведенный выше код должен выводить символ 'X' в обоих случаях; Тем не менее, я получил 88 в консоли, когда я выполняю код; Может ли кто-нибудь помочь мне понять, почему вывод ASCII-код, а не символ?

Ответы [ 3 ]

4 голосов
/ 29 февраля 2020

Тернарный оператор имеет собственный тип . Это не всегда совпадает с типом двух операндов, которые вы передаете в оператор. Вместо этого это тип, который обе ветви могут преобразовать в. В этом случае char имеет неявное преобразование в int. Это означает, что тип троичных операторов int. Смотрите пример ниже. Оператор (true ? x : 0).GetType() показывает, как весь троичный оператор имеет тип int.

public class Program
    {      
      public static void Main(string[] args)
        {
          char x = 'X';
          int i = 0;

          // Prints X fine
          Console.WriteLine(x);

          // Prints System.Int32
          Console.WriteLine((true ? x : 0).GetType());

          // Both print 88 - the int value of 'X'
          Console.WriteLine(true ? x : 0);
          Console.WriteLine(false ? i : x); 
        }
    }

«Почему» компилятор выбирает int, а не char, немного сложнее. C# spe c определяет, что char неявно преобразуется в ushort, int, uint, long, float, double и decimal. Это также говорит о том, что любой тип нумерации c является явно конвертируемым в char. Это ключевое отличие. Поскольку преобразование из char в int является неявным (не требует приведения), компилятор использует его для троичного преобразования и игнорирует потенциальное преобразование в другом направлении. Вы можете прочитать больше о правилах определения типа троичного оператора здесь .

0 голосов
/ 29 февраля 2020

Это не троичный оператор как таковой, это то, что символы могут быть неявно преобразованы в целые числа в c#, поэтому, столкнувшись со сценарием, когда троичное выражение имеет int и char и нуждается в "do if true" и " do if false, чтобы быть непротиворечивым, компилятор неявно преобразует char в int. целые числа не могут быть неявно преобразованы в символы, поэтому компилятор не будет go этот маршрут

int result = bool ? someChar : someInt; 

char result = bool ? (char)someInt : someChar;

Они оба в порядке; один использует неявное преобразование someChar в int для достижения согласованности (согласие int) для троичного, другой использует явное приведение someInt к символу для достижения согласованности char

Первый результат (печать, в вашем случае ) int, второй приведет к символу. Вы также можете поиграть с этим:

int result = bool ? (char)someInt : someChar;

Явное преобразование int в char, троичные результаты в char, неявное преобразование в int при сохранении в результате.

Код ascii для X: 88

0 голосов
/ 29 февраля 2020

Обратите внимание, что 'X' это не string, это char. Числовое значение c, значение которого равно 88. Это числовое значение c важно, поскольку компилятору необходимо разобраться в этой операции:

true ? x : 0

В конечном счете, троичный условная операция должна давать значение. Интуитивно понятно, что это значение может быть char или может быть int. Для компиляции кода это не может быть возможно, это всегда должен быть один из них. К счастью для компилятора, char может напрямую переводиться в int. В этом случае 88.

Таким образом, результатом операции является int, который выводится на консоль.

...