为什么我不能将通用列表声明为可为空?
我尝试使用以下代码:
private Nullable<List<IpAddressRange>> ipAddressRangeToBind;
但我收到以下警告:
列表类型必须是不可为 null 的值类型 为了将其用作泛型类型或方法中的参数“T” '系统.可为空'。
Im trying to use the following code:
private Nullable<List<IpAddressRange>> ipAddressRangeToBind;
But I am getting the following warning:
The type List must be a non-nullable value type in
order to use it as a parameter 'T' in the generic type or method
'System.Nullable'.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
List
已经是引用类型(对于任何类型的T
) - 您只能声明Nullable
其中T
是一个不可为 null 的值类型(它被声明为Nullable,其中 T : struct
)。但这没关系,因为如果您只是声明:
那么您仍然可以拥有
,因为引用类型总是可以为空。
List<T>
is already a reference type (for any kind ofT
) - you can only declareNullable<T>
whereT
is a non-nullable value type (it's declared asNullable<T> where T : struct
).But that's okay, because if you just declare:
then you can still have
because reference types are always nullable.
List
是一个引用类型 - 它已经可以为空 - 事实上它将被该声明初始化为 null。List<IpAddressRange>
is a reference type - it is already nullable - in fact it will be initialized to null by that declaration.您可以按原样使用它:
列表已经可以为空。
You can just use it as is:
List is already nullable.
由于泛型上的
where T : struct
约束,引用类型无法包装在Nullable
中。这种约束的原因是:
Nullable
有一个 bool 属性HasValue
和一个包含实际值类型的类型T
属性Value
价值。即使
HasValue == false
(即,如果可空包装变量设置为null
),您仍然会消耗值类型的空间,就像它在那里一样。它逻辑上可以为空,以允许您指定可选行为,但它不会节省任何空间。这与 C++ 中 boost::Optional 的工作方式非常相似。
Reference types cannot be wrapped in
Nullable<T>
due to awhere T : struct
constraint on the generic.The reasons for this constraint are:
Nullable<T>
has a bool propertyHasValue
and a typeT
propertyValue
which contains the actual value-type value.Even if
HasValue == false
(that is, if the nullable wrapped variable is set tonull
), you STILL consume the space for the value type as if it was there.It's logically nullable to allow you to specify optional behavior, but it doesn't save any space. This is very similar to how boost::optional works in C++.