用 null 初始化的 C# 值类型

标签 c# .net null nullable value-type

在 C# 3.0 中,您可以将 null 分配给 int 吗?类型(在 CLR 中是 int?是一个结构):

int? a = null;

但是当你定义一个自定义结构时:

struct MyStruct
{

}

编译这段代码时出现错误:

MyStruct a = null;

错误如下:

Cannot convert null to 'Example.MyStruct' because it is a non-nullable value type

而 int?是 CLR 中的一个结构,我们可以将 null 分配给它在某种程度上是违反直觉的。 我想 null 是隐式转换或装箱到 certian int 吗?表示空值的值。它是如何精确完成的?我怎样才能以可以执行以下行的方式扩展 MyStruct:

MyStruct a = null;

最佳答案

是因为int?实际上是简写Nullable<int> .您也可以为您的类型做同样的事情:

MyStruct? a = null;

null只能隐式转换为 nullable 类型,这意味着任何引用类型或任何可为 null 的值类型 - 其中后者表示 Nullable<T>对于一些 T .

请注意,这种从 null 转换的能力确实是一种语言特性——编译器正在转换它:

int? a = null;

进入

int? a = new int?();

它们的意思相同——基本上,可空值类型的“空”值是一个值,其中 HasValue为 false,默认情况下为 false。它与 null reference 不同 - 尽管装箱这样的 null 值导致 null 引用。

(这是一个跨越语言、库和 CLR 边界的特性的例子。库部分非常简单,CLR 部分只与装箱和拆箱有关——但在提升运算符等方面有很多在语言中。)

关于用 null 初始化的 C# 值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4270119/

相关文章:

c# - LINQ 搜索使用 *、%、?

C#引用;隐藏成员

设置自定义 Chocolatey 包时出现空键错误

javascript - 混淆 JavaScript 错误 : Cannot read property 'type' of null

mysql - 在 MySQL 5.7 中,我们可以在包含 NULL 值的列上创建索引吗?

c# - HttpRequestHeader cookie 格式

c# - 将平面列表转换为对象

.net - Elastic NEST 在具有内部关键字字段的文本字段上使用术语过滤器

.net - 从 XML 中剥离注释

c# - mscorlib.dll : Access to the path . 中发生类型为 'System.UnauthorizedAccessException' 的未处理异常。被拒绝