Страницы

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

вторник, 2 апреля 2019 г.

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

При попытке получить тип переменной которая была 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.


Ответ

Это не баг, это так задумано. Дело в том что 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

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

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