Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

.Net freamwork теряет тип nullable и приводит его к основному типу?

#c_sharp #net


При попытке получить тип переменной которая была Nullable, посредством вызова GetType,
я получаю основной тип и невозможно понять какой тип был изначально Nullable или нет:

using System;

namespace NullableQuestion
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Nullable val = 123;

            Console.WriteLine(val.GetType().ToString());

            Console.ReadKey();
        }
    }
}  


Вышеприведенный код выведет на консоль System.Int32, хотя, по логике вещей, он должен
вывести нам то что это System.Nullable[System.Int32]!
Как думаете это баг и пора писать в Microsoft?

UPDATE
Последовав совету 


  https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/nullable-types/how-to-identify-a-nullable-type


я попытался определить тип их способом

using System;

namespace NullableQuestion
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Nullable val = 123;

            Type type = val.GetType();

            Console.Write("val is nullable: ");
            if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable))
            {
                Console.WriteLine(true);
            } else
            {
                Console.WriteLine(false);
            }

            Console.WriteLine(val.GetType().ToString());

            Console.ReadKey();
        }
    }
}


Но данный код видимо работает не корректно либо я что то не верно понял. Я получаю false.
    


Ответы

Ответ 1



Это не баг, это так задумано. Дело в том что GetType() - это метод не System.Nullable, а System.Object, а значит вызвать его можно только предварительно упаковав (box) значение. Но особенность System.Nullable заключается в том, что при упаковке он всегда автоматически приводится к своему типу-параметру: int? x = 123; object y = x; // y - упакованный int При распаковке же случается обратное преобразование: object y = 123; // y - упакованный int int? x = (int?)y; // x == 123

Комментариев нет:

Отправить комментарий