C#中哪些数据类型可以是可空类型?

9

有人能给我提供一个C#可空类型的列表,或者指向我可以找到这个列表的地方吗?

例如:

  • 我知道Nullable<int>是可以的。
  • 我知道Nullable<byte[]>不行。

我想知道哪些类型是可空的,哪些不是。顺便说一句,我知道我可以在运行时测试这个。然而,这是为我们编写的代码生成器,所以我没有实际的类型。我只知道一个列是stringint32(等等)。


1
Nullable<byte[]> 不行,因为数组是引用类型(即使它们包含的类型是值类型)。请注意,这意味着您可以执行 byte[] b = null - fearofawhackplanet
4个回答

20

除了Nullable<T>本身之外,所有值类型都可以用于可空类型 - 即所有派生自System.ValueType的类型(包括enum!)。

原因是Nullable的声明类似于:

struct Nullable<T> where T : struct, new() { … }

3
因为整个重点在于修复值类型无法为空的问题(我将其称为一个严重的设计缺陷;其他人可能会持不同意见)。 (http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx)他们确实没有帮助解决问题,因为他们称其为“Nullable”!就像你的问题“哪些类型可以为空?”答案是:引用类型可以为空。 值类型与“Nullable”兼容,这正好相反。 叹气 ;-) - T.J. Crowder
2
@TJCrowder:就我个人而言,我不同意... - Konrad Rudolph
4
小细节:所有值类型都可以使用,除了 Nullable 类型本身。例如以下情况是无效的:var i = new Nullable<Nullable<int>>(); - Rob Levine
1
@Randy Minder:由于C#具有可扩展的类型系统,因此无法列出完整的类型列表。每个人都可以编写自己的值类型。使用这样的列表不可避免地会导致错误多、难以维护的代码。此外,即使在您的代码生成器中,只要该代码生成器是用.NET编写的,您也可以在运行时测试它。 - Konrad Rudolph
1
@Rob Levine:有价值的指摘。谢谢。 - Konrad Rudolph
显示剩余3条评论

2
如果一个类型可以被赋予值或者可以被赋予null,那么它就被称为可空类型,这意味着该类型没有任何值。因此,可空类型可以表示一个值,或者表示不存在任何值。例如,引用类型如String是可空的,而值类型如Int32则不是。值类型不能是可空的,因为它已经有足够的容量来表示该类型适当的值;它没有额外的容量来表示null值。
Nullable结构体仅支持使用值类型作为可空类型,因为引用类型天生就是可空的。
Nullable类提供了对Nullable结构体的补充支持。Nullable类支持获取可空类型的基础类型,并对其进行比较和相等操作,而其基础值类型不支持通用比较和相等操作。
来源:帮助文档http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

1

它可以是任何值类型,包括结构体,但不能是引用类型,因为这些本质上已经是可空的。

是: Int32 double DateTime CustomStruct 等等。

否: string Array CustomClass 等等。

有关更多信息,请参见MSDN:http://msdn.microsoft.com/en-us/library/2cf62fcy(v=VS.80).aspx


它可以是任何值类型,包括结构体 - 除了可空结构体Nullable<T>的50%。;p - Marc Gravell

0

任何数据类型都可以是可空的。 可空对你有用,因为普通 int 不可空,所以转换成可空 int 是必要的。

Nullable<int[]> 无法工作,因为 int[] 已经是可空类型。

Nullable 不支持已经是可空类型的类型。

请注意,只有当类型不是可空类型时才需要将其转换为可空类型。

值类型不可为空,值类型包括 int、float、double、long 等,以及你创建的结构体。

而引用类型(例如类)已经是可空的。

你可以使用 ? 运算符将类型变为可空类型。 请注意,即使这并不是一个好的做法,如果你在已经是可空类型的类型上使用问号运算符,它也不会引发错误。

int? myNullableVar = null;
int[]? MyNullableArr = null; //not necessary but does not raise an error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接