#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
Комментариев нет:
Отправить комментарий