Convert.ToString(null)
повертає
null
Як я і очікував.
Але
Convert.ToString(null as object)
повертає
""
Чому вони різні?
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 перевантаження, оскільки це єдиний сумісний, що залишився.
Дійсно волохаті подробиці того, як працює цей розрив краватки, висвітлено у розділі 7.4.3 специфікації мови C #.
Convert.ToString(string)це лише функція ідентичності, а Convert.ToString(object)насправді проходить складніше. На перший погляд я погоджуюся, що вони повинні повернути те саме, але конвертований шар BCL - це не те, про що я дуже обізнаний, і можливо, є вагомі причини для різниці (я скептично налаштований)
(string)null(string)o
Виходячи з чудової відповіді на вирішення перевантаження JaredPar - залишається питання "чому Convert.ToString(string)повертається нульовим, а Convert.ToString(object)повертається string.Empty"?
І відповідь на це ... тому що документи говорять так :
Convert.ToString (string) повертає "вказаний екземпляр рядка; фактичне перетворення не проводиться."
Convert.ToString (об'єкт) повертає "рядкове представлення значення, або String.Empty, якщо значення є нульовим."
EDIT: Що стосується того, чи це "помилка в специфікації", "дуже поганий дизайн API", "чому це було вказано так" тощо. це як велика справа.
System.Convertмає методи перетворення кожного базового типу до себе . Це дивно - оскільки конверсія не потрібна і не можлива, тому методи в кінцевому підсумку просто повертають параметр. Convert.ToString(string)поводиться так само. Я припускаю, що це тут для сценаріїв генерації коду.Convert.ToString(object)має 3 варіанти при проходженні null. Кинути, повернути нуль або повернути рядок.Порожня. Кидання було б погано - вдвічі, тому припущення, що вони використовуються для генерованого коду. Повернення null вимагає, щоб ваш абонент зробив нульову перевірку - знову ж таки, не великий вибір у створеному коді. Повернення рядка. Порожнє здається розумним вибором. Решта System.Convertугод із типовими значеннями - які мають значення за замовчуванням.Convert.ToString(string)означає порушення правила "немає фактичної конверсії". Оскільки System.Convertє статичним класом корисності, кожен метод може логічно трактуватися як власний. Існує дуже мало сценаріїв реального світу, де така поведінка має бути "дивовижною", тому нехай зручність перемагає (можливу) правильність.