访问字符串数组时的语法

本文关键字:语法 数组 字符串 访问 | 更新日期: 2023-09-27 17:56:42

以下内容:

string[] strArr = {
    "SOMETHING",
    "ELSE",
    "HERE"
};
var a = strArr['B' - 'A'];

['B' - 'A']到底是怎么回事,在哪里可以找到这种行为的文档?

访问字符串数组时的语法

这是将字符代码隐式转换为整数。表示数字 1 是一种糟糕的方式,因为 B 是 66,A 是 65。

最终结果是你得到 [1] 元素("ELSE")。

这是有效的,因为 char 实现了 IConvertible 接口,并且具有此支持方法

/// <internalonly/>
int IConvertible.ToInt32(IFormatProvider provider) {
    return Convert.ToInt32(m_value);
}

更多关于字符.cs参考来源

有一个从charint的隐式转换。 从字符到 int 的转换为您提供该字符的 UTF-16 代码。 由于 B (ASCII 66) 是 UTF-16 中 A (ASCII 65) 之后的下一个字母,因此 B - A 将等于1 42-41

所以

strArr['B' - 'A']

相当于

strArr[1]

至于文档,请尝试char(C#参考)。

首先,'B''A' 是存储为 16 位数字的字符文本,将解析为值为 1char

其次,编译器识别表达式 'B' - 'A' 是类型 char,但string[]有一个索引器,它接受类型 int 的参数。如上面的文档中所述,char类型可以隐式转换为int;所以这是编译器做出的选择。

在 C# 中,有一个从 char 而不是 int 的隐式转换(但不是相反)。所以int x = 'a';编译。实际上,编译器将您的代码转换为其他内容。这是原始代码,以及编译器生成的代码:

用户代码:

string[] strArr = { "SOMETHING", "ELSE", "HERE" };
char left = 'B';
char right = 'A';
int index = left - right;
var a = strArr[index];

生成的编译器代码:

string[] strArr = { "SOMETHING", "ELSE", "HERE" };
char c = 'B';
char c2 = 'A';
int num = (int)c - c2; // 66 - 65
string text = array[num];

我写了一个关于这个的细节答案一周去。看看吧。