Jak w tytule mam zagwostke, dlaczego int? a = 5; a.GetType()
zwraca int
zamiast int?
Nie znam się to się wypowiem.
Int? to nadal int tylko z property nullable. Czy typ jest nullable określa się przez Nullable.GetUnderlyingType(). Tak mnie się wydaje, więc jak coś, to niech ktoś sprostuje bez bicia.
Bo tak jest sensowniej i tak to zostało zaklepane (decyzja projektowa). Oczywiście możesz się z tym spierać, to jest kwestia gustu w pewien sposób.
Tutaj masz wszystko wytłumaczone
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types
Typ Nullable<T> jest typem wartościowym - strukturą generyczną z dwoma polami : value typu T i hasValue typu bool . wartość false jesli struktura ma wartość - null.
Metoda GetType() to jest metoda klasy Object . Żeby z niej skorzystać trzeba wykonać pakowanie ( pakowanie jest niejawne - przez kompilator C#)
Pakowany jest typ bazowy czyli int nie int?.
Z typami referencyjnymi jest inaczej .
Jeśli chcesz sprawdzić czy coś jest nullable to robisz coś takiego. Przykład z MSDN
using System;
namespace ConsoleApp1
{
class Program
{
public static void Main()
{
int? a = 14;
Console.WriteLine(IsOfNullableType(a)); // output: True
int b = 17;
Console.WriteLine(IsOfNullableType(b)); // output: False
}
static bool IsOfNullableType<T>(T o)
{
var type = typeof(T);
return Nullable.GetUnderlyingType(type) != null;
}
}
}