问题描述
当我写
可空<可空<&日期时间GT;>测试= NULL;
我得到一个编译错误:
<$ C '?System.DateTime的'$ C>的类型必须是为了在泛型类型或方法来使用它作为一个paramreter'T'非空值类型'System.Nullable< T>
但可空< T>
是结构
。所以它应该是非空
于是,我就创建这个结构
:
公共结构美孚< T>其中T:结构
{
私人的T值;
公共美孚(T值)
{
THIS.VALUE =价值;
}
公共静态明确经营者的Foo< T>(ΔT值)
{
返回新的Foo< T>(value.Value);
}
公共静态隐运营商T(美孚< T>价值)?
{
返回新的可空< T>(value.value);
}
}
现在,当我写
可空<富<&日期时间GT;>测试1 = NULL;
&符LT;可空<&日期时间GT;>测试2 = NULL;
&符LT; DateTime的> TEST3 = NULL;
第一行是确定,但第二行和第三行,我得到了以下两个编译错误:
类型'System.DateTime的?一定是为了使用它在通用的参数'T'非空值类型类型或方法MyProject.Foo< T>
(第二行只)
和
无法将null转换为MyProject.Foo<&System.DateTime的GT?;因为它是一个非空的值类型
美孚<可空< DateTime的>>测试=新富<&日期时间GT;?();
不工作也不事件,如果可空< DateTime的>
是结构
在概念上,我可以理解为什么可空< T> ;
是空的,它避免了像的DateTime ??????????
东西,但是我仍然可以有列表<名单<名单<名单<名单< DateTime的>>>>>
...
那么,为什么这个限制为什么我不能重现这种行为美孚< T>
?这是限制由编译器执行的还是内在的可空< T>
代码
我读这个问题,但它只是说,这是不是没有一个答案可能从根本上说,它为什么不可能的。
Nullable<T>
is indeed a struct, but the precise meaning of the generic struct
constraint as stated in the docs is:
For the same reason, your line
Foo<Nullable<DateTime>> test2 = null;
results in the compiler error you are seeing, because your generic struct
constraint restricts your generic T
argument in a way so Nullable<DateTime>
must not be specified as an actual argument.
A rationale for this may have been to make calls such as
Nullable<Nullable<DateTime>> test = null;
less ambiguous: Does that mean you want to set test.HasValue
to false
, or do you actually want to set test.HasValue
to true
and test.Value.HasValue
to false
? With the given restriction to non-nullable type arguments, this confusion does not occur.
Lastly, the null
assignment works with Nullable<T>
because - as implied by the selected answers and their comments to this SO question and this SO question - the Nullable<T>
type is supported by some compiler magic.
这篇关于为什么可空< T>可为空?为什么不能复制?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!