#c# #.net #casting #int #nullable
#c# #.net #Кастинг #инт #обнуляемый
Вопрос:
Если у меня есть object
ссылка, которая ссылается на byte?
, short?
или int?
, есть ли способ безоговорочно привести или преобразовать эту ссылку на объект в int? без написания отдельного кода для каждого случая?
Например:
byte? aByte = 42; // .. or aByte = null
object anObject = aByte;
//...
var anInt = (int?)anObject //As expected, doesn't work
Комментарии:
1. Извините, но что вы подразумеваете под «безоговорочным броском»?
2. Я имел в виду «что бы это ни было — байт короткий или int, преобразуйте его в int».
Ответ №1:
Я бы использовал Convert.ToInt32(object)
:
object o = ...; // Boxing...
int? x = o == null ? (int?) null : Convert.ToInt32(o);
Обратите внимание, что когда вы вставляете в поле int?
short?
или byte?
, вы всегда получаете нулевую ссылку или вставляемое в коробку значение, не подлежащее нулю — такого понятия, как «вставляемое в коробку значение с нулевым значением», как таковое, не существует.
Convert.ToInt32
будет работать для всех типов коробок, которые вы упомянули, хотя это также будет работать для таких вещей, как строка «42» и т.д. Разве это проблема?
Комментарии:
1. Итак, когда блокируется a
Nullable<T>
, который содержит нулевое значение, то результирующий объект == null?2. @BorisB.: Да. (Результирующая ссылка — в ней нет задействованного объекта .)
3. @BorisB попробуйте сами,
ReferenceEquals((int?)null, null)
возвращает true.
Ответ №2:
var i = (anObject as IConvertible).ToInt32(null);
Комментарии:
1. Помните, что он имеет дело с нулевыми значениями. Если
anObject
равно null, это приведет к выбросу.2. Я предполагаю, что есть причина, по которой это тип с нулевым значением, и что эта причина заключается в том, что он может быть нулевым, и в этом случае наш код взорвется
3. @AnthonyPegram, это не относится к данному вопросу.
4. Почему вы так думаете? Это применимо, потому что он явно использует типы с нулевым значением в своем вопросе и примере. Тот факт, что в его конкретном примере кода используется 42, не отменяет того, что его код имеет дело с коробкой
byte?, short?, int?
и т. Д.5. Верно, я немного изменил пример