.Net — Приведение или преобразование байта в штучной упаковке?, short? или int? в int?

#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. Верно, я немного изменил пример