访问字符串数组时的语法
本文关键字:语法 数组 字符串 访问 | 更新日期: 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参考来源
有一个从char
到int
的隐式转换。 从字符到 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 位数字的字符文本,将解析为值为 1
的char
。
其次,编译器识别表达式 '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];
我写了一个关于这个的细节答案一周去。看看吧。