Convert.ToString(null)
보고
null
예상대로.
그러나
Convert.ToString(null as object)
보고
""
왜 다른가요?
답변
여기에는 2 개의 과부하가 ToString
있습니다.
Convert.ToString(object o);
Convert.ToString(string s);
C # 컴파일러는 기본적으로 입력과 함께 작동 할 가장 구체적인 오버로드를 선택하려고합니다. null
값은 참조 형식으로 변환한다. 이 경우 string
는보다 구체적 object
이므로 승자로 선정됩니다.
에서 null as object
당신은 표현의 유형을 응고했습니다 object
. 이것은 더 이상 string
오버로드와 호환되지 않으며 컴파일러는 object
남은 유일한 호환 가능한 오버로드이므로 오버로드를 선택합니다 .
이 타이 브레이킹 작동 방식에 대한 자세한 내용은 C # 언어 사양의 섹션 7.4.3에서 다룹니다.
답변
JaredPar의 뛰어난 오버로드 해결 답변 에 이어 “왜 Convert.ToString(string)
null을 Convert.ToString(object)
반환 하지만 반환 string.Empty
합니까 “라는 질문이 남아 있습니다 .
그리고 그것에 대한 대답은 … 문서 가 그렇게 말하고 있기 때문입니다 .
Convert.ToString (string)은 “지정된 문자열 인스턴스, 실제 변환이 수행되지 않음”을 반환합니다.
Convert.ToString (object)는 “값의 문자열 표현 또는 값이 null 인 경우 String.Empty”를 반환합니다.
편집 : 이것이 “사양의 버그”, “매우 나쁜 API 디자인”, “왜 이렇게 지정 되었는가”등인지 여부에 대해.-내가 볼 수없는 이유에 대한 몇 가지 근거를 살펴 보겠습니다. 그것은 큰 문제입니다.
System.Convert
모든 기본 유형을 자체 로 변환하는 메소드가 있습니다 . 이것은 이상합니다. 변환이 필요하지 않거나 가능하지 않기 때문에 메서드는 매개 변수를 반환합니다.Convert.ToString(string)
동일하게 작동합니다. 나는 이것이 코드 생성 시나리오를 위해 여기에 있다고 가정합니다.Convert.ToString(object)
통과되면 3 가지 선택이null
있습니다. Throw, return null 또는 return string.Empty. 던지는 것은 나쁠 것입니다-두 배로 생성 된 코드에 사용된다는 가정하에. null을 반환하려면 호출자가 null 검사를 수행해야합니다. 생성 된 코드에서는 좋은 선택이 아닙니다. 반환하는 string.Empty는 합리적인 선택으로 보입니다. 나머지System.Convert
는 기본값이있는 값 유형 을 다룹니다.- null을 반환하는 것이 “올바른”지 여부는 논쟁의 여지가 있지만 string.Empty는 확실히 더 유용합니다. 변경
Convert.ToString(string)
은 “실제 전환 없음”규칙을 위반하는 것을 의미합니다. 이후System.Convert
정적 유틸리티 클래스, 각 방법은 논리적으로 그 자체로 취급 할 수있다. 이 동작이 “놀라워”야하는 실제 시나리오는 거의 없으므로 유용성이 (가능한) 정확성을이기도록하십시오.