【问题标题】:Why do I get multiple digits on an indexing + question mark operator on a string?为什么我在字符串的索引 + 问号运算符上得到多个数字?
【发布时间】:2017-12-13 08:54:54
【问题描述】:

当我运行以下代码时

public class Program
{
    public static void Main()
    {
        string s = "480";
        Console.WriteLine(1 == -1 ? 0 : s[1]);
        Console.WriteLine(s[1]);
    }
}

我明白了

56
8

我不明白我是如何得到 56 的。

【问题讨论】:

  • 条件运算符的缺点之一

标签: c# conditional-operator


【解决方案1】:

您的0 : s[1]s[1] 中的char 转换为整数。而8在ASCII表中的值为56

您也想在左侧使用char(使用单引号):

Console.WriteLine(1 == -1 ? '0' : s[1]);

【讨论】:

  • 或者更好地将条件运算符的返回值分配给一个变量(既不是var也不是object,而是char),以尽量减少此类问题的风险。那时他会遇到编译器错误。
【解决方案2】:

我不明白我是如何得到 56 的。

在第一行它被解释为字符8的UTF-16代码:

Console.WriteLine(1 == -1 ? 0 : s[1]);

使用条件运算符,您可以在此处选择 int 0char,以便编译器将后者隐式转换为 int(它为您提供 UTF-16 代码)并打印出来到控制台

在第二行中,您实际上得到了打印的 char

Console.WriteLine(s[1]);

这里没有隐式转换。

【讨论】:

  • @PatrikHofman 感谢您的编辑,显然对于正确的英语语法来说还为时过早 ;)
【解决方案3】:

来自Documentation on the ?: Operator

“要么 first_expression 和 second_expression 的类型必须相同,要么必须存在从一种类型到另一种类型的隐式转换。”

“条件运算符是右结合的。”

所以您的结果在第一种情况下变为数字,在第二种情况下变为字符。

【讨论】:

    【解决方案4】:

    s[1] 是 char 的 int 值。

    问题运算符表示从零开始的整数,这意味着它是一个 int。它将 char 转换为 int。

    【讨论】:

      猜你喜欢
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2020-06-20
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      相关资源
      最近更新 更多