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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage