8

这个问题更多是关于将 a 添加?到值类型而不是关于int?

在 C# 中,anint是一种值类型。是int?值类型还是引用类型?

在我看来,它应该是一个引用类型null

4

4 回答 4

22

int?相当于Nullable<int>which 意味着它是一个struct

所以这意味着它是一个值类型

在我看来,它应该是一个引用类型,因为它可以为空。

你的假设是错误的。来自文档;

Nullable 结构表示可以分配为 null的值类型。Nullable 结构支持仅使用值类型作为可空类型,因为引用类型在设计上可以为空。

所以它有2个值;

  1. 数据的价值
  2. 确定值是否已设置的布尔值。( Nullable<T>.HasValue)
于 2013-09-11T14:30:57.003 回答
2

可空类型是 System.Nullable 结构的实例,因此int?是值类型。

于 2013-09-11T14:34:44.203 回答
1

int?不是引用类型。它是一个struct(值类型)。

它有自己的值,就像一个普通的 int 加上一个额外的“null”值。使用 Nullable 类型,您可以使用HasValue.

MSDN

于 2013-09-11T14:32:38.657 回答
0

编辑我应该首先从这个例子开始:

想想枚举。我们编写的每个枚举Enum都会自动扩展,这是一个类。因此,我们编写的值类型扩展了一个由 .NET 团队编写的类,它是一个引用类型。

您可以通过两种方式拆分类型世界:

  • 它们是否包含null
  • 它们是否是值类型

理论上所有的组合都是可能的。如果我没记错的话,至少在 C# 中,不能null产生空集的引用类型的组合。这种组合没有例子。

基本上所有其他 3 种组合都是可能的:

  • 可以为 null 并且是值类型的类型
  • 不能为 null 并且是值类型的类型
  • 可以为 null 并且是引用类型的类型

作为值类型或引用类型的性质无关null(至少在设计和使用语言的方式上,而不是在下面的实际工程细节的方式上)。

值类型是导致变量、参数和字段之间的赋值以完全克隆实例的类型。引用类型是不这样做的类型。

这基本上与实例占用的内存类型(无论是堆栈、堆还是其他东西)无关null 或无关。

于 2013-09-11T14:41:37.373 回答