¿Por qué Nullable <T> es nullable? ¿Por qué no se puede reproducir?
Cuando yo escribo
Nullable<Nullable<DateTime>> test = null;
Me sale un error de compilación:
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>'
PeroNullable<T>
es unstruct
por lo que se supone que es no anulable.
Así que traté de crear estestruct
:
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);
}
}
Ahora cuando escribo
Nullable<Foo<DateTime>> test1 = null;
Foo<Nullable<DateTime>> test2 = null;
Foo<DateTime> test3 = null;
La primera línea está bien, pero para la segunda y tercera línea obtengo los dos siguientes errores de compilación:
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 línea solamente)
y
Cannot convert null to 'MyProject.Foo<System.DateTime?> because it is a non-nullable value type'
Foo<Nullable<DateTime>> test = new Foo<DateTime?>();
no funciona ni evento siNullable<DateTime>
es unstruct
.
Conceptualmente, puedo entender por quéNullable<T>
es anulable, evita tener cosas comoDateTime??????????
sin embargo todavía puedo tenerList<List<List<List<List<DateTime>>>>>
...
Entonces, ¿por qué esta limitación y por qué no puedo reproducir este comportamiento enFoo<T>
? ¿Es esta limitación impuesta por el compilador o es intrínseca enNullable<T>
¿código?
Yo leoesta pregunta pero solo dice que no es posible ninguna de las respuestas dice fundamentalmente por qué no es posible.