#c_sharp #net
При попытке получить тип переменной которая была Nullable, посредством вызова GetType, я получаю основной тип и невозможно понять какой тип был изначально Nullable или нет: using System; namespace NullableQuestion { class Program { static void Main(string[] args) { System.Nullableval = 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
Комментариев нет:
Отправить комментарий