#.net #nullable
#.net #nullable
Вопрос:
Нужен простой, но эффективный метод для получения значения из Nullable, когда T неизвестно во время компиляции.
Пока есть что-то вроде этого:
public static object UnwrapNullable(object o)
{
if (o == null)
return null;
if (o.GetType().IsGenericType amp;amp; o.GetType().GetGenericTypeDefinition() == typeof(Nullable<>))
return ???
return o;
}
здесь можно что-нибудь сделать, не погружаясь в динамическую генерацию кода?
используется в .NET 2.0
Комментарии:
1. Вы считаете, что объект является Nullable<T>, или вы даже этого не знаете? Если вы знаете, что o является Nullable<T> , то вызов o.GetType() вернет T.
2. Согласен с dlev — почему эта функция просто не принимает Nullable<T> ?
3. Почему вы не знаете, что такое T во время компиляции?
4. Кроме того, зачем разворачивать,
Nullable<T>
если вы просто собираетесь вернутьсяnull
!?5. @Tesserex, ICR: Я предполагаю, что это делается с помощью отражений, следовательно, он получает
object
ответ.
Ответ №1:
o
никогда не может ссылаться на экземпляр Nullable<T>
. Если вы вставляете в поле значение типа значения с возможностью обнуления, вы либо получаете значение в штучной упаковке с ненулевым базовым типом, либо нулевую ссылку.
Другими словами, o.GetType()
может никогда не возвращать Nullable<T>
для любого значения o
— независимо от типа o
. Например:
Nullable<int> x = 10;
Console.WriteLine(x.GetType()); // System.Int32
Здесь мы в конечном итоге помещаем значение в бокс, x
потому что GetType()
оно объявлено в object
, а не переопределено в Nullable<T>
(потому что оно невиртуальное). Это немного странно.
Комментарии:
1. хммм, да, я думаю, я не продумал это до конца.
Ответ №2:
Это не имеет смысла.
Если у вас есть код:
int? x = null; //int? == Nullable<int>
if ( null == x ) { Console.WriteLine("x is null"); }
else { Console.WriteLine( "x is " x.ToString() ); }
Результатом будет «x равно нулю», напечатанное в консоли.