Convert.ToString(null)
возвращается
null
Как я и предполагал.
Но
Convert.ToString(null as object)
возвращается
""
Почему они разные?
Convert.ToString(null)
возвращается
null
Как я и предполагал.
Но
Convert.ToString(null as object)
возвращается
""
Почему они разные?
Ответы:
Здесь ToStringв игру вступают 2 перегрузки
Convert.ToString(object o);
Convert.ToString(string s);
Компилятор C # по существу пытается выбрать наиболее конкретную перегрузку, которая будет работать с вводом. nullЗначение конвертируемые в любой ссылочного типа. В этом случае stringболее конкретно, objectи, следовательно, он будет выбран победителем.
В null as objectвы закрепили тип выражения как object. Это означает, что он больше не совместим с stringперегрузкой, и компилятор выбирает objectперегрузку, поскольку она остается единственной совместимой.
По-настоящему непростые подробности того, как работает эта проблема, рассмотрены в разделе 7.4.3 спецификации языка C #.
Convert.ToString(string)это просто функция идентификации, хотя на Convert.ToString(object)самом деле пройти путь труднее. На первый взгляд, я бы согласился, что они должны вернуть то же самое, но конвертируемый слой BCL - это не то, в чем я очень разбираюсь, и, возможно, есть веская причина для разницы (хотя я скептически настроен)
(string)nullили, если ваш объект называется o, то(string)o
Следуя отличному ответу JaredPar по разрешению перегрузки, остается вопрос: «Почему Convert.ToString(string)возвращается null, но Convert.ToString(object)возвращается string.Empty»?
И ответ на это ... потому что так сказано в документации :
Convert.ToString (string) возвращает «указанный экземпляр строки; фактическое преобразование не выполняется».
Convert.ToString (объект) возвращает «строковое представление значения или String.Empty, если значение равно нулю».
РЕДАКТИРОВАТЬ: Что касается того, является ли это «ошибкой в спецификации», «очень плохим дизайном API», «почему он был указан таким образом» и т. Д. - я попытаюсь объяснить, почему я не вижу это как большое дело.
System.Convertимеет методы для преобразования каждого базового типа в себя . Это странно - поскольку преобразование не требуется или невозможно, поэтому методы в конечном итоге просто возвращают параметр. Convert.ToString(string)ведет себя так же. Я предполагаю, что это здесь для сценариев генерации кода.Convert.ToString(object)после прохождения имеет 3 варианта ответа null. Бросить, вернуть null или вернуть строку. Пусто. Бросать было бы плохо - вдвойне, если предположить, что они используются для сгенерированного кода. Возврат null требует, чтобы ваш вызывающий объект выполнил проверку на null - опять же, не лучший выбор для сгенерированного кода. Возврат string.Empty кажется разумным выбором. Остальное System.Convertкасается типов значений, которые имеют значение по умолчанию.Convert.ToString(string)означает нарушение правила «без фактического преобразования». Поскольку System.Convertэто статический служебный класс, каждый метод логически можно рассматривать как собственный. В реальном мире очень мало сценариев, в которых такое поведение должно быть «неожиданным», так что пусть удобство использования преобладает над (возможной) правильностью.