При попытке получить тип переменной которая была Nullable, посредством вызова GetType, я получаю основной тип и невозможно понять какой тип был изначально Nullable или нет:
using System;
namespace NullableQuestion
{
class Program
{
static void Main(string[] args)
{
System.Nullable
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
Type type = val.GetType();
Console.Write("val is nullable: ");
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable
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
Комментариев нет:
Отправить комментарий