Компилятор знает, что строка никогда не может быть int?
, поэтому он говорит вам об этом. Это не значит, что int?
бесполезно. Ваш попытанный вариант использования далек от нормального. Нормальным является «Я хочу представить целое число и вероятность того, что значение отсутствует / неизвестно». Для этого int?
работает очень хорошо.
С чего бы вам ожидать, что ваш оригинальный код будет работать? Почему это будет полезно?
Обратите внимание, что вы можете использовать as
с обнуляемыми типами для распаковки:
object o = "hello";
int? i = o as int?;
if (i == null)
{
// o was not a boxed int
}
else
{
// Can use i.Value to recover the original boxed value
}
РЕДАКТИРОВАТЬ: увидев ваш комментарий, вы не используете as
для разбора вещей. Вы, вероятно, хотите использовать int.TryParse
:
string text = "123":
int value;
if (int.TryParse(text, out value))
{
Console.WriteLine("Parsed successfully: {0}", value);
}
else
{
Console.WriteLine("Unable to parse text as an integer");
}
Если вы уверены, что строка должна быть целым числом (т. Е. В противном случае это ошибка), тогда вы можете просто использовать int.Parse
:
int value = int.Parse(text);
Это вызовет исключение, если синтаксический анализ завершится неудачей.
Обратите внимание, что оба эти метода позволяют вам указать поставщика формата (обычно это информация о культуре), который позволяет вам выразить, как числа выражаются в этом формате (например, разделители тысяч).
РЕДАКТИРОВАТЬ: В ответ на ваш новый вопрос, компилятор предотвращает это, потому что он знает, что строка не может возможно быть упакованным int - преобразование никогда не будет успешным. Когда ему известно только, что исходное значение является объектом, оно может успешно.
Например, предположим, я сказал вам: "Вот форма: это квадрат?" Это разумный вопрос. Разумно спросить: вы не можете сказать, не глядя на форму.
Если, однако, я сказал: "Вот треугольник: это квадрат?" Тогда вы будете иметь право смеяться мне в лицо, поскольку треугольник не может быть квадратом - вопрос не имеет смысла.