的數組時下列要求:語法訪問字符串
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?我沒有編碼,我只是想弄清楚別人的混亂。 –
我剛剛投票。當人們投票時我無法忍受,因爲他們認爲你應該知道一些你不知道的東西。不是投票的理由。沒有人知道一切。 –
而你剛剛得到了「爲什麼這段代碼無法工作」的近距離投票......這顯然不是你的問題。更新:現在已經消失:) –