развернуть T из Nullable

#.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 равно нулю», напечатанное в консоли.