2016-07-12 118 views
0

的数组时下列要求:语法访问字符串

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

到底是一个什么对与['B' - 'A'],我在哪里可以找到这种行为的文档?

+0

为什么downvotes?我没有编码,我只是想弄清楚别人的混乱。 –

+0

我刚刚投票。当人们投票时我无法忍受,因为他们认为你应该知道一些你不知道的东西。不是投票的理由。没有人知道一切。 –

+0

而你刚刚得到了“为什么这段代码无法工作”的近距离投票......这显然不是你的问题。更新:现在已经消失:) –

回答

2

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

最终结果是您获得[1]元素(“ELSE”)。

这工作,因为炭实现了IConvertible接口,并且在char.csreference source

2

这种支持方法

/// <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] 
0

在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关于这一个星期去。一探究竟。

1

至于文档,请尝试char (C# Reference)

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

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

+0

您还可以阅读更多关于[隐式转换](https://msdn.microsoft.com/en-us/library/z5z9kes2.aspx)的信息。 –