2016-07-12 4 views
0

의 배열에 접근 :구문 때 다음으로 문자열

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

정확히 ['B' - 'A']로 진행되고, 어디 내가이 문제의 문서를 찾을 수 있습니다 무엇입니까?

+0

왜 downvotes? 나는 코드를 만들지 않았고, 나는 다른 누군가의 엉망을 파악하려고 시도하고있다. –

+0

나는 방금 upvoted. 사람들이 당신이 모르는 것을 알아야한다고 생각하기 때문에 투표를 할 때 참을 수 없습니다. 투표를하지 않을 이유가 없습니다. 그리고 아무도 모든 것을 알지 못합니다. –

+0

그리고 "이 코드가 작동하지 않는 이유는 무엇입니까?"에 가까운 투표가 있습니다 ... 분명히 당신의 질문이 아니 었습니다.업데이트 : 이제 끝났습니다. –

답변

2

이는 문자 코드를 정수로 암묵적으로 변환합니다. B가 66이고 A가 65 인 숫자 1을 나타내는 것은 끔찍한 방법입니다.

결국 [1] 요소 ("ELSE")를 얻게됩니다.

이 숯불이 IConvertible 인터페이스를 구현하므로 작동 및 implicit conversion from char to int있다 char.csreference source

2

의지지 방법이

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

더 갖는다. char에서 int로 변환하면 해당 문자의 UTF-16 코드가 제공됩니다. B (ASCII 66)은 UTF-16에서 A (ASCII 65) 다음의 다음 글자이므로 B - A1이 될 42-41과 같습니다.

너무

strArr['B' - 'A'] 

는 C#으로

strArr[1] 
0

동등하다 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)을 사용해보십시오. 16 비트 숫자로 저장된 캐릭터 리터럴

먼저 'B''A'는 값 1char로 해석된다.

둘째, 컴파일러는 식 'B' - 'A'char 타입의 것을 인식하지만 string[]int의 인수를 인덱서있다. 위의 문서에서 언급했듯이 char 유형은 암시 적으로 int으로 변환 될 수 있습니다. 그래서 이것은 컴파일러가 선택하는 것입니다.

+0

[암시 적 변환] (https://msdn.microsoft.com/en-us/library/z5z9kes2.aspx)에 대한 자세한 내용을 볼 수도 있습니다. –