Почему 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>
код?
Я читаюэтот вопрос но это просто говорит о том, что невозможно, ни один из ответов не говорит в основном, почему это невозможно.