我试图使用以下代码:
private Nullable<List<IpAddressRange>> ipAddressRangeToBind;
但我收到以下警告:
类型List必须是非可空值类型 为了在泛型类型或方法中将其用作参数“T” 'System.Nullable'。
答案 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
中。
这种限制的原因是:
Nullable<T>
包含bool属性HasValue
和类型T
属性Value
,其中包含实际的值类型值。
即使HasValue == false
(即,如果可空包装变量设置为null
),您仍然会消耗值类型的空间,就好像它在那里一样。
逻辑可以允许您指定可选行为,但它不会节省任何空间。这与boost :: optional在C ++中的工作方式非常相似。