Почему Nullable <T> nullable? Почему это не может быть воспроизведено?

Когда я пишу

Nullable<Nullable<DateTime>> test = null;

Я получаю ошибку компиляции:

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>'

НоNullable<T> этоstruct так что он должен быть ненулевым.

Поэтому я попытался создать этоstruct:

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);
    }
}

Теперь, когда я пишу

        Nullable<Foo<DateTime>> test1 = null;
        Foo<Nullable<DateTime>> test2 = null;
        Foo<DateTime> test3 = null;

Первая строка в порядке, но для второй и третьей строк я получаю две следующие ошибки компиляции:

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>' (только вторая строка)

а также

Cannot convert null to 'MyProject.Foo<System.DateTime?> because it is a non-nullable value type'

        Foo<Nullable<DateTime>> test = new Foo<DateTime?>();

не работает ни одно событие, еслиNullable<DateTime> этоstruct.

Концептуально я могу понять, почемуNullable<T> обнуляется, избегает таких вещей, какDateTime?????????? Однако я все еще могу иметьList<List<List<List<List<DateTime>>>>>...

Так почему это ограничение и почему я не могу воспроизвести это поведение вFoo<T>? Это ограничение применяется компилятором или оно присущеNullable<T> код?

Я читаюэтот вопрос но это просто говорит о том, что невозможно, ни один из ответов не говорит в основном, почему это невозможно.

Ответы на вопрос(3)

Ваш ответ на вопрос