Por que é Nullable <T> anulável? Por que não pode ser reproduzido?
Quando escrevo
Nullable<Nullable<DateTime>> test = null;
Eu recebo um erro de compilação:
The type 'System.Datetime?' must be a non-nullable value type in order to use it as a paramreter 'T' in the generic type or method 'System.Nullable<T>'
MasNullable<T>
é umstruct
então é suposto ser não anulável.
Então eu tentei criar issostruct
:
public struct Foo<T> where T : struct
{
private T value;
public Foo(T value)
{
this.value = value;
}
public static explicit operator Foo<T>(T? value)
{
return new Foo<T>(value.Value);
}
public static implicit operator T?(Foo<T> value)
{
return new Nullable<T>(value.value);
}
}
Agora quando eu escrevo
Nullable<Foo<DateTime>> test1 = null;
Foo<Nullable<DateTime>> test2 = null;
Foo<DateTime> test3 = null;
A primeira linha é ok, mas para a segunda e terceira linhas eu recebo os dois seguintes erros de compilação:
The type 'System.DateTime?' must be a non-nullable value type in order to use it as a parameter 'T' in the generic type or method 'MyProject.Foo<T>'
(segunda linha apenas)
e
Cannot convert null to 'MyProject.Foo<System.DateTime?> because it is a non-nullable value type'
Foo<Nullable<DateTime>> test = new Foo<DateTime?>();
não funciona nem evento seNullable<DateTime>
é umstruct
.
Conceitualmente, eu posso entender porqueNullable<T>
é anulável, evita ter coisas comoDateTime??????????
no entanto eu ainda posso terList<List<List<List<List<DateTime>>>>>
...
Então, por que essa limitação e por que não posso reproduzir esse comportamento emFoo<T>
? Esta limitação é imposta pelo compilador ou é intrínseca emNullable<T>
código?
Eu leioessa questão mas apenas diz que não é possível que nenhuma das respostas diga fundamentalmente porque não é possível.