2016-07-12 112 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)的信息。 –