访问字符串数组时的语法

时间:2016-07-12 18:22:06

标签: c#

以下内容:

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

['B' - 'A']究竟发生了什么,我在哪里可以找到此行为的文档?

4 个答案:

答案 0 :(得分:2)

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

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

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

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

更多char.csreference source

答案 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。看看吧。