【问题标题】:C# Console.WriteLine prints a Char type as Integer [duplicate]C# Console.WriteLine 将 Char 类型打印为 Integer [重复]
【发布时间】:2018-01-20 00:14:52
【问题描述】:

我不明白为什么这种打印 char 数据类型一次是 char,另一次是整数

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。为什么?

【问题讨论】:

  • 您是否尝试查看文档?它会更快。
  • 表达式(condition) ? x : y 只能有一种类型,在编译时确定。由于您可以将char 转换为int,但反之亦然,因此该类型为int。因此,调用了WriteLine(int) 覆盖。
  • 如果您查看文档here,它会说,“first_expression 和 second_expression 的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。 " 由于存在从charint 的隐式转换,但不是相反,类型变为int(隐式转换意味着它可以在没有显式转换的情况下工作 - 你可以做到@987654333 @,但你不能这样做char foo = 1;)。

标签: c# char console.writeline


【解决方案1】:

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

  1. 计算结果为布尔值的表达式
  2. 返回任意类型值的表达式
  3. 返回与 #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”到整数的隐式转换。

【讨论】:

  • OP 可能感兴趣,如果将 #2 转换为 object,则初始示例将给出预期的输出,但这只是因为 Console.WriteLine 只真正关心 ToString,该对象表达式返回的类型现在都是 object,而不是像 char/int 这样的不同类型。
猜你喜欢
  • 2012-01-12
  • 2013-10-24
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多