Подтвердить что ты не робот

Convert.ToInt32 (String) на String.Empty vs. Null

Выражение Convert.ToInt32(String.Empty) будет вызывать исключение FormatException, потому что он не может разобрать пустую строку в значение Int32.

Однако выражение Convert.ToInt32(DirectCast(Nothing, String)) в VB.NET или Convert.ToInt32((string)null) в С# будет анализировать значение null до значения Int32, равного нулю.

Копаясь в источнике .NET в Convert.cs, я вижу следующий код:

public static int ToInt32(String value) {
    if (value == null) 
        return 0;
    return Int32.Parse(value, CultureInfo.CurrentCulture);
}

Это объясняет поведение, но я хотел бы понять, почему он был написан таким образом, вместо того, чтобы возвращать нуль для пустой строки?

Например, почему это не было написано как:

public static int ToInt32(String value) {
    if (String.IsNullOrEmpty(value)) 
        return 0;
    return Int32.Parse(value, CultureInfo.CurrentCulture);
}

(Обратите внимание, что String.IsNullOrEmpty() и Convert.ToInt32() оба относятся к .NET 2.0, возможно, ранее.)

Изменить: Мой вопрос очень похож на на этот вопрос, но я также хотел бы знать, почему Convert.ToInt32(String.Empty) вызывает исключение вместо того, чтобы возвращать значение Int32 по умолчанию 0. (Ответ заключается в том, что String.Empty не является значением по умолчанию String, поэтому нет корреляции.)

4b9b3361

Ответ 1

У меня нет абсолютно никакого представления о фактической конструкции команды, основывающейся на этом, но мне кажется, что это может быть своего рода "эквивалентность стоимости по умолчанию". Null является значением по умолчанию для строки, поэтому представляется логичным преобразовать его в значение по умолчанию для int. String.Empty, однако, является строкой, как и любые другие ненулевые строковые данные, поэтому ожидается, что она будет отформатирована, поэтому исключение.

Я думаю, что ArgumentNullException было бы "более чистым" решением, но я не знаю, какие внутренние проблемы могут быть за этим все...

Другое редактирование:
Там, прямо в документации MSDN, один из 5 возможных результатов:

Успешное преобразование. Для конверсий между двумя различными базовыми типами, не указанными в предыдущих результатах, все расширяющиеся преобразования, а также все суживающиеся преобразования, которые не приводят к потере данных, будут успешными, и метод вернет значение целевой базовый тип.

Кажется, что преобразование из нулевого объекта в другой тип не имеет причины для отказа (не ошибка формата, а не преобразование неподдерживаемого типа), но тип значения, такой как int, не имеет представления "без данных", поэтому значение по умолчанию значение целевого типа.

Быстрая мысль - "противоположное" преобразование, Convert.ToString(0), не возвращает значение null, потому что:

  • 0 - это данные, во многих случаях это может быть очень важным и важным значением.
  • null не является правильным строковым представлением 0