当我写
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>'
But Nullable<T>
is astruct
所以它应该是不可为空的。
所以我试图创建这个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>
代码中固有的?
我读了这个问题,但它只是说不可能,没有一个答案从根本上说明为什么不可能。