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

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 디자인”, “왜 이렇게 지정 되었는가”등인지 여부에 대해.-내가 볼 수없는 이유에 대한 몇 가지 근거를 살펴 보겠습니다. 그것은 큰 문제입니다.

  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정적 유틸리티 클래스, 각 방법은 논리적으로 그 자체로 취급 할 수있다. 이 동작이 “놀라워”야하는 실제 시나리오는 거의 없으므로 유용성이 (가능한) 정확성을이기도록하십시오.

답변