2016-07-12 13 views
0

Mit folgendem:Syntax beim Zugriff auf Array von Strings

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

Was genau mit den ['B' - 'A'] los ist, und wo kann ich die Dokumentation für dieses Verhalten finden?

+0

warum downvotes? Ich habe den Code nicht gemacht, ich versuche nur, das Durcheinander eines anderen herauszufinden. –

+0

Ich habe gerade gestimmt. Ich kann nicht stehen, wenn Leute abstimmen, weil sie denken, dass du etwas wissen solltest, das du nicht weißt. Kein Grund zur Abstimmung. Und niemand weiß alles. –

+0

UND Sie haben gerade eine enge Abstimmung für "warum funktioniert dieser Code nicht" ... was natürlich nicht Ihre Frage war.Update: Es ist jetzt weg :) –

Antwort

2

Das konvertiert implizit Zeichencodes in Ganzzahlen. Es ist eine schreckliche Möglichkeit, die Zahl 1 darzustellen, da B 66 und A 65 ist.

Das Endergebnis ist, dass Sie das Element [1] ("ELSE") erhalten. Diese

funktioniert, weil char implementiert die IConvertible-Schnittstelle und hat diese Methode unterstützt

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

Mehr auf char.csreference source

2

Es gibt eine implicit conversion from char to int. Die Umwandlung von char in int gibt Ihnen den UTF-16-Code dieses Zeichens. Da B (ASCII 66) der nächste Buchstabe nach A (ASCII 65) in UTF-16 ist, wäre B - A gleich 42-41, was 1 wäre.

so

strArr['B' - 'A'] 

zu

strArr[1] 
0

In C# äquivalent ist, gibt es eine implizite Konvertierung von char nicht int (aber nicht das Gegenteil). So int x = 'a'; kompiliert. Tatsächlich wandelt der Compiler Ihren Code in etwas anderes um. Hier und Original-Code und der Code generiert durch den Compiler:

Anwendercode:

string[] strArr = { "SOMETHING", "ELSE", "HERE" }; 
char left = 'B'; 
char right = 'A'; 
int index = left - right; 
var a = strArr[index]; 

generiert Compiler Code:

string[] strArr = { "SOMETHING", "ELSE", "HERE" }; 
char c = 'B'; 
char c2 = 'A'; 
int num = (int)c - c2; // 66 - 65 
string text = array[num]; 

Ich schrieb einen Details answer über diese eine Woche unterwegs. Hör zu.

1

Wie für die Dokumentation, versuchen Sie char (C# Reference).

Zuerst 'B' und 'A', die Zeichen sind Literale als 16-Bit-Zahlen gespeichert ist, wird an einen 1char mit dem Wert lösen.

Zweitens erkennt der Compiler, dass der Ausdruck 'B' - 'A' vom Typ char, aber string[] hat einen Indexer, die int ein Argument vom Typ nimmt. Wie in der obigen Dokumentation erwähnt, kann der Typ char implizit in einen int konvertiert werden; Das ist also die Wahl, die der Compiler macht.

+0

Sie können auch mehr über [implizite Konvertierung] (https://msdn.microsoft.com/en-us/library/z5z9kes2.aspx) lesen. –