C#中的三元运算符行为

Har*_*rry 1 .net c# ascii ternary

我最近遇到了以下代码行。

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); 
        }
    }
Run Code Online (Sandbox Code Playgroud)

据我所知,上面的代码在这两种情况下都应该输出字符“X”;但是,当我执行代码时,我在控制台中得到了 88;谁能帮我理解为什么输出是 ASCII 代码而不是字符?

jus*_*mer 5

三元运算符有它自己类型。这并不总是与您传递给语句的两个操作数的类型相同。相反,它是两个分支都可以转换为的类型。在这种情况下,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); 
        }
    }
Run Code Online (Sandbox Code Playgroud)

编译器选择int而不是的“为什么”char有点复杂。的C#规范定义了一个char隐式转换为ushortintuintlongfloatdouble,和decimal。它还表示任何数字类型都可以显式转换为char. 这是关键的区别。因为从charto的转换int隐式的(它不需要强制转换),编译器将它用于三元并忽略另一个方向的潜在转换。您可以在此处阅读有关确定三元语句类型的规则的更多信息。

  • @Harry:因为每个“char”都可以是“int”,但并非每个“int”都可以是“char”。一种数据类型比另一种数据类型大。 (2认同)