Warum ist Nullable <T> nullable? Warum kann es nicht reproduziert werden?
Wenn ich schreibe
Nullable<Nullable<DateTime>> test = null;
Ich erhalte einen Kompilierungsfehler:
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>'
AberNullable<T>
ist einstruct
es sollte also nicht nullwertfähig sein.
Also habe ich versucht, dies zu schaffenstruct
:
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);
}
}
Jetzt wenn ich schreibe
Nullable<Foo<DateTime>> test1 = null;
Foo<Nullable<DateTime>> test2 = null;
Foo<DateTime> test3 = null;
Die erste Zeile ist in Ordnung, aber für die zweite und dritte Zeile erhalte ich die beiden folgenden Kompilierungsfehler:
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>'
(nur zweite Zeile)
und
Cannot convert null to 'MyProject.Foo<System.DateTime?> because it is a non-nullable value type'
Foo<Nullable<DateTime>> test = new Foo<DateTime?>();
funktioniert nicht und nicht wennNullable<DateTime>
ist einstruct
.
Konzeptionell kann ich verstehen, warumNullable<T>
ist nullable, vermeidet es, solche Sachen zu habenDateTime??????????
kann ich aber noch habenList<List<List<List<List<DateTime>>>>>
...
Warum also diese Einschränkung und warum kann ich dieses Verhalten nicht reproduzieren?Foo<T>
? Wird diese Einschränkung vom Compiler erzwungen oder ist sie inhärent?Nullable<T>
Code?
ich lesediese Frage Aber es heißt nur, dass es nicht möglich ist. Keine der Antworten sagt grundlegend aus, warum es nicht möglich ist.