문자열과 int, 암시적이고 명시 적
문제
동료가 이것을 물어 보았고, 내 두뇌에서 곤경에 처한 상태에서 나는 답이 없었습니다.
당신이 할 수있는 이유는 무엇입니까?
string ham = "ham " + 4;
하지만:
string ham = 4;
당신이있을 때 스트링 변환을위한 암시 적 캐스트/작동이있는 경우 연결, 왜 똑같지 않습니까? 할당 문자열로? (물론 운영자 과부하를하지 않고)
해결책
컴파일러를 연결하면 문을 돌립니다 "ham" + 4
전화로 String.Concat
, 두 가지가 필요합니다 object
매개 변수, 값 4
그런 다음 박스형입니다 ToString
그것에 호출됩니다.
과제에는 암시 적 변환이 없습니다 int
에게 string
, 따라서 할당 할 수 없습니다 4
a string
명시 적으로 변환하지 않고.
다시 말해, 두 과제는 C#에서 매우 유사하게 보이지만 컴파일러에 의해 매우 다르게 처리됩니다.
다른 팁
연결을 할 때 암시 적 변환은 없습니다. 문자열 연결은 string.concat call로 분해되며 객체를 가져 오는 과부하가 있습니다. 이 과부하는 문자열로 (명시 적) 변환을 수행합니다.
첫 번째 표현식의 오른쪽의 값은 문자열이지만, 두 번째 표현식의 오른쪽의 값은 그렇지 않습니다. 이 컨덕턴스는 첫 번째 시나리오에서 과제가 특별한 일을하지 않는 첫 번째 시나리오에서 마술을 제공하는 것입니다. 두 번째 시나리오에서는 과제가 계속해서 멍청합니다.
표현식
"ham " + 4
문자열 유형과 추가 연산자의 조합에 기초하여 4를 문자열로 암시 적으로 변환합니다. 특히 "+"연산자의 품질이며 연산자 과부하를 할 때 동일한 유형의 물건을 수동으로 구현할 수 있습니다.
비슷하고 덜 명백한 예는 다음과 같습니다.
long mynumber = int64.maxvalue -1;
이 경우 "1"은 32 비트 정수로 평가되어야하지만 암시 적으로 변환됩니다. 컴파일러가 지원하는 암시 적 변환의 철저한 목록은 C# 언어 사양 섹션 6.1을 확인할 수 있습니다.
편집 : 명확하게 말하면, 내가 언급 한 언어 사양 섹션은 컴파일러가 지원하는 암시 적 변환을 목록에 반면 "+"와 같은 연산자는 자체 지원 변환을 가질 수 있습니다.