Тип Nullable не является nullable типом?

Вы можете сделать это с помощью Используя php explode():

$string = "Hi, my name is Bob, I am 20 years old and like cats. Hi, my name is Dylan, I am 25 years old and like dogs. Hi, my name is Tambourine, I am 30 years old and like turtles";
print_r (explode(".",$string));

Используя Regex:

$string = "Hi, my name is Bob, I am 20 years old and like cats. Hi, my name is Dylan, I am 25 years old and like dogs. Hi, my name is Tambourine, I am 30 years old and like turtles";
$arr = preg_split('/[ap]\.m\.(*SKIP)(*FAIL)|\./', $string);
print_r($arr);
44
задан Blake Pettersson 14 November 2013 в 04:00
поделиться

2 ответа

В соответствии с MSDN :

Вызов GetType для типа Nullable вызывает операцию бокса выполняется, когда тип неявно преобразован в объект. Поэтому GetType всегда возвращает объект Type, который представляет базовый тип, а не Обнуляемый тип.

Когда вы упаковываете обнуляемый объект, упаковывается только базовый тип.

Опять же, из MSDN :

Упаковка ненулевого типа значения, допускающего обнуляемое значение. блокирует сам тип значения, а не System.Nullable, который переносит значение введите.

56
ответ дан 11 November 2019 в 22:15
поделиться

В дополнение к правильному ответу Ромена, если вы хотите сравнить «настоящие» типы (то есть, без неявного преобразования любого обнуляемого типа в его базовый тип), вы можете создать метод расширения следующим образом:

public static class MyExtensionMethods
{
    public static Type GetRealType<T>(this T source)
    {
        return typeof(T);
    }
}

А затем попробуйте выполнить следующие тесты:

int? a = 0;
Console.WriteLine(a.GetRealType() == typeof(int?));         // True
Console.WriteLine(a.GetRealType() == typeof(int));          // False

int b = 0;
Console.WriteLine(b.GetRealType() == typeof(int));          // True
Console.WriteLine(b.GetRealType() == typeof(int?));         // False

DateTime? c = DateTime.Now;
Console.WriteLine(c.GetRealType() == typeof(DateTime?));    // True
Console.WriteLine(c.GetRealType() == typeof(DateTime));     // False

DateTime d = DateTime.Now;
Console.WriteLine(d.GetRealType() == typeof(DateTime));     // True
Console.WriteLine(d.GetRealType() == typeof(DateTime?));    // False

РЕДАКТИРОВАТЬ ...

Для полноты - и подсказки комментариев SLaks ниже - вот альтернативная версия, которая использует только тип времени компиляции, когда source имеет значение null или Nullable <> ; в противном случае он использует GetType и возвращает тип времени выполнения:

public static class MyExtensionMethods
{
    public static Type GetRealType<T>(this T source)
    {
        Type t = typeof(T);

        if ((source == null) || (Nullable.GetUnderlyingType(t) != null))
            return t;

        return source.GetType();
    }
}
22
ответ дан 11 November 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: