Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Console.WriteLine将字符类型打印为整数_C#_Char_Console.writeline - Fatal编程技术网

C#Console.WriteLine将字符类型打印为整数

C#Console.WriteLine将字符类型打印为整数,c#,char,console.writeline,C#,Char,Console.writeline,我不明白为什么这个字符数据类型一次打印为字符,另一次打印为整数 static void Main(string[] args) { char x = 'A'; int i = 0; Console.WriteLine(x); // A Console.WriteLine(true ? x : 0); // 65 ??? Console.WriteLine(false ? i : x); // 65 ??? Console.ReadLine()

我不明白为什么这个字符数据类型一次打印为字符,另一次打印为整数

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

我希望输出是
A,A,A
,但上面的输出是
A,65,65
。为什么?

三元/条件运算符
需要以下三个操作数:

  • 计算结果为布尔值的表达式
  • 返回任何类型值的表达式
  • 返回与#2类型相同的值的表达式
  • 返回值将始终为同一类型;这就是为什么#2和#3必须是同一类型

    如果第三个操作数与第二个操作数的类型不同,编译器将查找隐式强制转换,并尽可能使用它

    所以当你写作的时候

    var x = flag ? 65 : 'A';
    
    这和

    int x = flag ? (int)65 : (int)'A';
    
    …并将始终返回一个
    int

    如果不是这样,则无法将
    的结果分配给强类型变量,这将是一个严重的障碍

    此外,您还可以这样写:

    var x = flag ? 65 : "A"; //Notice it's a string and not a char
    

    …因为没有从“A”到整数的隐式转换。

    您是否尝试查看文档?它会更快。表达式
    (条件)?x:y
    只能有一种类型,在编译时确定。由于可以将
    char
    转换为
    int
    ,但不能将其转换为
    int
    ,因此该类型为
    int
    。因此,调用了
    WriteLine(int)
    重写。如果查看文档,它会说,“要么第一个表达式和第二个表达式的类型必须相同,要么存在从一种类型到另一种类型的隐式转换。”因为存在从
    char
    int
    的隐式转换,但不是相反,类型变成了
    int
    (隐式转换意味着它在没有显式强制转换的情况下工作-可以执行
    int foo='A';
    ,但不能执行
    char foo=1;
    )。OP可能感兴趣,如果将#2强制转换为
    对象,则初始示例将给出它们的预期输出,但这只是因为
    Console.WriteLine
    只真正关心
    ToString
    ,表达式返回的对象类型现在都是
    object
    ,而不是像
    char
    /
    int
    这样的不同类型。