以下内容:
string[] strArr = {
"SOMETHING",
"ELSE",
"HERE"
};
var a = strArr['B' - 'A'];
['B' - 'A']
究竟发生了什么,我在哪里可以找到此行为的文档?
答案 0 :(得分:2)
这是隐式将字符代码转换为整数。代表数字1是一种可怕的方式,因为B是66而A是65。
最终结果是你得到[1]元素(" ELSE")。
这是有效的,因为char实现了IConvertible
接口,并且具有这种支持方法
/// <internalonly/>
int IConvertible.ToInt32(IFormatProvider provider) {
return Convert.ToInt32(m_value);
}
答案 1 :(得分:2)
有一个implicit conversion from char
to int
。从char到int的转换为您提供该字符的UTF-16代码。由于B
(ASCII 66)是UTF-16中A
(ASCII 65)之后的下一个字母,B
- A
将等于42-41
将是1
。
所以
strArr['B' - 'A']
相当于
strArr[1]
答案 2 :(得分:1)
至于文档,请尝试char (C# Reference)。
首先,'B'
和'A'
(以16位数字存储的字符文字)将解析为char
,其值为1
。
其次,编译器认识到表达式'B' - 'A'
的类型为char
,但string[]
有一个索引器,它带有int
类型的参数。如上文所述,char
类型可以隐式转换为int
;所以这是编译器的选择。
答案 3 :(得分:0)
在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];
我写了一篇关于这一周的详细信息answer。看看吧。