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
。为什么?三元/条件运算符?
需要以下三个操作数:
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
这样的不同类型。