为什么我不能将通用列表声明为可空?

时间:2011-09-14 15:18:02

标签: c# null nullable

我试图使用以下代码:

private Nullable<List<IpAddressRange>> ipAddressRangeToBind;

但我收到以下警告:

  

类型List必须是非可空值类型   为了在泛型类型或方法中将其用作参数“T”   'System.Nullable'。

4 个答案:

答案 0 :(得分:47)

List<T>已经是一种引用类型(对于任何类型的T) - 您只能声明Nullable<T>其中T是一个不可为空的值类型(它已声明作为Nullable<T> where T : struct)。

但是没关系,因为如果你刚宣布:

private List<IpAddressRange> ipAddressRangeToBind;

然后你仍然可以

ipAddressRangeToBind = null;

因为引用类型总是可以为空。

答案 1 :(得分:10)

List<IpAddressRange>是一个引用类型 - 它已经可以为空 - 实际上它将被该声明初始化为null。

答案 2 :(得分:6)

您可以按原样使用它:

List<IpAddressRange> ipAddressRangeToBind = null;  

列表已经可以为空了。

答案 3 :(得分:4)

由于通用的Nullable<T>约束,无法将引用类型包装在where T : struct中。

这种限制的原因是:

  1. 根据定义,引用类型已经可以为空,
  2. Nullable空间效率不高,但更具“逻辑”可空性。
  3. Nullable<T>包含bool属性HasValue和类型T属性Value,其中包含实际的值类型值。

    即使HasValue == false(即,如果可空包装变量设置为null),您仍然会消耗值类型的空间,就好像它在那里一样。

    逻辑可以允许您指定可选行为,但它不会节省任何空间。这与boost :: optional在C ++中的工作方式非常相似。