的数组时下列要求:语法访问字符串
string[] strArr = {
"SOMETHING",
"ELSE",
"HERE"
};
var a = strArr['B' - 'A'];
到底是一个什么对与['B' - 'A']
,我在哪里可以找到这种行为的文档?
的数组时下列要求:语法访问字符串
string[] strArr = {
"SOMETHING",
"ELSE",
"HERE"
};
var a = strArr['B' - 'A'];
到底是一个什么对与['B' - 'A']
,我在哪里可以找到这种行为的文档?
这是隐式转换字符代码为整数。代表数字1是一种可怕的方式,因为B是66,A是65.
最终结果是您获得[1]元素(“ELSE”)。
这工作,因为炭实现了IConvertible
接口,并且在char.csreference source
这种支持方法
/// <internalonly/>
int IConvertible.ToInt32(IFormatProvider provider) {
return Convert.ToInt32(m_value);
}
更多有一个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]
在C#,有一个从一个字符的隐式转换不是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关于这一个星期去。一探究竟。
至于文档,请尝试char (C# Reference)。
首先,'B'
和'A'
(它们是存储为16位数字的字符文字)将解析为值为1
的char
。
其次,编译器识别出表达'B' - 'A'
是char
类型的,但具有string[]
一个索引这需要int
类型的参数。如上述文档所述,char
类型可以隐式转换为int
;所以这是编译器的选择。
您还可以阅读更多关于[隐式转换](https://msdn.microsoft.com/en-us/library/z5z9kes2.aspx)的信息。 –
为什么downvotes?我没有编码,我只是想弄清楚别人的混乱。 –
我刚刚投票。当人们投票时我无法忍受,因为他们认为你应该知道一些你不知道的东西。不是投票的理由。没有人知道一切。 –
而你刚刚得到了“为什么这段代码无法工作”的近距离投票......这显然不是你的问题。更新:现在已经消失:) –