Выражение 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, поэтому нет корреляции.)