문제

동료가 이것을 물어 보았고, 내 두뇌에서 곤경에 처한 상태에서 나는 답이 없었습니다.

당신이 할 수있는 이유는 무엇입니까?

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을 확인할 수 있습니다.

편집 : 명확하게 말하면, 내가 언급 한 언어 사양 섹션은 컴파일러가 지원하는 암시 적 변환을 목록에 반면 "+"와 같은 연산자는 자체 지원 변환을 가질 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top