Чому Convert.ToString (null) повертає інше значення, якщо ви додаєте 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 перевантаження, оскільки це єдиний сумісний, що залишився.

Дійсно волохаті подробиці того, як працює цей розрив краватки, висвітлено у розділі 7.4.3 специфікації мови C #.


15
Гаразд. Тому використовується одна перевантаження замість іншої. Має сенс. Але чи не повинні обидва перевантаження повертати одне і те ж? +1 btw.
Джон Макінтайр

2
@JohnMacIntyre - Це залежить від команди розробника, а не від компілятора.
Джон

8
@JohnMacIntyre Якщо ви подивитесь на реалізацію, Convert.ToString(string)це лише функція ідентичності, а Convert.ToString(object)насправді проходить складніше. На перший погляд я погоджуюся, що вони повинні повернути те саме, але конвертований шар BCL - це не те, про що я дуже обізнаний, і можливо, є вагомі причини для різниці (я скептично налаштований)
JaredPar

Я прийшов сюди шукати, як перетворити нульовий об’єкт в нульовий рядок. Відповідь для інших пошукових (string)null(string)o
запитів

65

Виходячи з чудової відповіді на вирішення перевантаження JaredPar - залишається питання "чому Convert.ToString(string)повертається нульовим, а Convert.ToString(object)повертається string.Empty"?

І відповідь на це ... тому що документи говорять так :

Convert.ToString (string) повертає "вказаний екземпляр рядка; фактичне перетворення не проводиться."

Convert.ToString (об'єкт) повертає "рядкове представлення значення, або String.Empty, якщо значення є нульовим."

EDIT: Що стосується того, чи це "помилка в специфікації", "дуже поганий дизайн API", "чому це було вказано так" тощо. це як велика справа.

  1. System.Convertмає методи перетворення кожного базового типу до себе . Це дивно - оскільки конверсія не потрібна і не можлива, тому методи в кінцевому підсумку просто повертають параметр. Convert.ToString(string)поводиться так само. Я припускаю, що це тут для сценаріїв генерації коду.
  2. Convert.ToString(object)має 3 варіанти при проходженні null. Кинути, повернути нуль або повернути рядок.Порожня. Кидання було б погано - вдвічі, тому припущення, що вони використовуються для генерованого коду. Повернення null вимагає, щоб ваш абонент зробив нульову перевірку - знову ж таки, не великий вибір у створеному коді. Повернення рядка. Порожнє здається розумним вибором. Решта System.Convertугод із типовими значеннями - які мають значення за замовчуванням.
  3. Дискусійно, чи повернення нуля більш "правильне", але рядок. Порожній, безумовно, більш корисний. Змінення Convert.ToString(string)означає порушення правила "немає фактичної конверсії". Оскільки System.Convertє статичним класом корисності, кожен метод може логічно трактуватися як власний. Існує дуже мало сценаріїв реального світу, де така поведінка має бути "дивовижною", тому нехай зручність перемагає (можливу) правильність.

Чи справедливо сказати, що це помилка в специфікації?
Джон Макінтайр

3
це не відповідає чому це так. Сказати, що він поводиться так, тому що документально поводити себе так, це тавтологічно.
CodesInChaos

2
@JohnMacIntyre IMO, справедливо можна сказати, що це дуже поганий дизайн API.
CodesInChaos

7
@CodeInChaos - не тавтологія, якщо ви не припускаєте, що документи написані на основі спостережуваної поведінки після розробки BCL. Думаю, це було б дивне припущення. IOW, це не "задокументовано так поводитись", це "документально підтверджено, що він буде поводитись так", тобто " вказано, що так поводитись".
Марк Брокетт

8
Це лише перекладає питання на "чому було вказано так поводитись"
CodesInChaos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.