本文介绍了为什么可空< T>可为空?为什么不能复制?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我写



可空<可空<&日期时间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.

这篇关于为什么可空&LT; T&GT;可为空?为什么不能复制?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 21:28