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

发布于 2024-12-04 19:52:14 字数 227 浏览 1 评论 0原文

我尝试使用以下代码:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

魂ガ小子 2024-12-11 19:52:14

List 已经是引用类型(对于任何类型的 T) - 您只能声明 Nullable 其中 T 是一个不可为 null 的值类型(它被声明为 Nullable,其中 T : struct)。

但这没关系,因为如果您只是声明:

private List<IpAddressRange> ipAddressRangeToBind;

那么您仍然可以拥有

ipAddressRangeToBind = null;

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

List<T> is already a reference type (for any kind of T) - you can only declare Nullable<T> where T is a non-nullable value type (it's declared as Nullable<T> where T : struct).

But that's okay, because if you just declare:

private List<IpAddressRange> ipAddressRangeToBind;

then you can still have

ipAddressRangeToBind = null;

because reference types are always nullable.

半夏半凉 2024-12-11 19:52:14

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

List<IpAddressRange> is a reference type - it is already nullable - in fact it will be initialized to null by that declaration.

ˉ厌 2024-12-11 19:52:14

您可以按原样使用它:

List<IpAddressRange> ipAddressRangeToBind = null;  

列表已经可以为空。

You can just use it as is:

List<IpAddressRange> ipAddressRangeToBind = null;  

List is already nullable.

寒冷纷飞旳雪 2024-12-11 19:52:14

由于泛型上的 where T : struct 约束,引用类型无法包装在 Nullable 中。

这种约束的原因是:

  1. 引用类型根据定义已经可以为空,并且
  2. Nullable 的空间效率不是很高,而是更多的“逻辑”可空性。

Nullable 有一个 bool 属性 HasValue 和一个包含实际值类型的类型 T 属性 Value价值。

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

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

Reference types cannot be wrapped in Nullable<T> due to a where T : struct constraint on the generic.

The reasons for this constraint are:

  1. Reference types are already nullable by definition, and
  2. Nullable is not very space efficient, but more a "logical" nullability.

Nullable<T> has a bool property HasValue and a type T property Value which contains the actual value-type value.

Even if HasValue == false (that is, if the nullable wrapped variable is set to null), 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++.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文