null을 캐스팅하면 Convert.ToString (null)이 다른 값을 반환하는 이유는 무엇입니까?


116
Convert.ToString(null)

보고

null

예상대로.

그러나

Convert.ToString(null as object)

보고

""

왜 다른가요?

답변:


143

여기에는 2 개의 과부하가 ToString있습니다.

Convert.ToString(object o);
Convert.ToString(string s);

C # 컴파일러는 기본적으로 입력과 함께 작동 할 가장 구체적인 오버로드를 선택하려고합니다. null값은 참조 형식으로 변환한다. 이 경우 string는보다 구체적 object이므로 승자로 선정됩니다.

에서 null as object당신은 표현의 유형을 응고했습니다 object. 이것은 더 이상 string오버로드와 호환되지 않으며 컴파일러는 object남은 유일한 호환 가능한 오버로드이므로 오버로드를 선택합니다 .

이 타이 브레이킹 작동 방식에 대한 자세한 내용은 C # 언어 사양의 섹션 7.4.3에서 다룹니다.


15
확인. 그래서 그것은 다른 것 대신에 하나의 과부하를 사용하고 있습니다. 말이된다. 하지만 두 과부하가 같은 결과를 반환하면 안 되나요? +1 btw.
John MacIntyre

2
@JohnMacIntyre-컴파일러가 아닌 개발 팀에 따라 다릅니다.
JonH

8
@JohnMacIntyre 구현을 살펴보면 실제로는 경로를 따르기가 더 어렵지만 실제로는 Convert.ToString(string)ID 함수일뿐 Convert.ToString(object)입니다. 한눈에 나는 그들이 똑같이 반환해야한다는 데 동의하지만 BCL의 컨버터블 레이어는 내가 잘 아는 것이 아니며 그 차이에 대한 좋은 이유가있을 수 있습니다. (나는 회의적입니다)
JaredPar

null 개체를 null 문자열로 변환하는 방법을 찾고 있습니다. 다른 조사자에 대한 대답은 (string)null, 또는 객체가 호출되는 경우 오, 다음(string)o
rayzinnz

65

JaredPar의 뛰어난 오버로드 해결 답변 에 이어 "왜 Convert.ToString(string)null을 Convert.ToString(object)반환 하지만 반환 string.Empty합니까 "라는 질문이 남아 있습니다 .

그리고 그것에 대한 대답은 ... 문서그렇게 말하고 있기 때문입니다 .

Convert.ToString (string)은 "지정된 문자열 인스턴스, 실제 변환이 수행되지 않음"을 반환합니다.

Convert.ToString (object)는 "값의 문자열 표현 또는 값이 null 인 경우 String.Empty"를 반환합니다.

편집 : 이것이 "사양의 버그", "매우 나쁜 API 디자인", "왜 이렇게 지정 되었는가"등인지 여부에 대해.-내가 볼 수없는 이유에 대한 몇 가지 근거를 살펴 보겠습니다. 그것은 큰 문제입니다.

  1. System.Convert모든 기본 유형을 자체 로 변환하는 메소드가 있습니다 . 이것은 이상합니다. 변환이 필요하지 않거나 가능하지 않기 때문에 메서드는 매개 변수를 반환합니다. Convert.ToString(string)동일하게 작동합니다. 나는 이것이 코드 생성 시나리오를 위해 여기에 있다고 가정합니다.
  2. Convert.ToString(object)통과되면 3 가지 선택이 null있습니다. Throw, return null 또는 return string.Empty. 던지는 것은 나쁠 것입니다-두 배로 생성 된 코드에 사용된다는 가정하에. null을 반환하려면 호출자가 null 검사를 수행해야합니다. 생성 된 코드에서는 좋은 선택이 아닙니다. 반환하는 string.Empty는 합리적인 선택으로 보입니다. 나머지 System.Convert는 기본값이있는 값 유형 을 다룹니다.
  3. null을 반환하는 것이 "올바른"지 여부는 논쟁의 여지가 있지만 string.Empty는 확실히 더 유용합니다. 변경 Convert.ToString(string)은 "실제 전환 없음"규칙을 위반하는 것을 의미합니다. 이후 System.Convert정적 유틸리티 클래스, 각 방법은 논리적으로 그 자체로 취급 할 수있다. 이 동작이 "놀라워"야하는 실제 시나리오는 거의 없으므로 유용성이 (가능한) 정확성을이기도록하십시오.

사양의 버그라고 말하는 것이 공정합니까?
John MacIntyre

3
그것이 왜 이런지 대답하지 않습니다. 이와 같이 행동하는 것으로 문서화되어 있기 때문에 이렇게 행동한다고 ​​말하는 것은 팽팽한 것입니다.
CodesInChaos

2
@JohnMacIntyre IMO가 매우 나쁜 API 디자인이라고 말하는 것이 공평합니다.
CodesInChaos

7
@CodeInChaos-문서가 BCL이 개발 된 후 관찰 가능한 동작을 기반으로 작성되었다고 가정하지 않는 한 팽팽한 표현이 아닙니다. 그것은 이상한 가정이라고 생각합니다. IOW, "처럼 행동하는 기록이"아니에요, 그것의 "가 있음을 설명 한다 처럼 행동이."- 즉, 그것의 " 지정 이 같은 행동".
Mark Brackett

8
그것은 단지 "가이 같은 행동을 규정 한 이유"에 대한 질문을 이동
CodesInChaos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.