结构在 C# 中真的不能为空吗?

本文关键字:不能 真的 结构 | 更新日期: 2023-09-27 17:57:01

下面是一些代码,演示我无法将结构类型声明和初始化为 null。 Nullable 类型是一个结构体,那么为什么我可以将其设置为 null?

Nullable<bool> b = null;
if (b.HasValue)
{
    Console.WriteLine("HasValue == true");
}
//Does not compile...
Foo f = null;
if (f.HasValue)
{
    Console.WriteLine("HasValue == true");
}

其中Foo定义为

public struct Foo
{
    private bool _hasValue;
    private string _value;
    public Foo(string value)
    {
        _hasValue = true;
        _value = value;
    }
    public bool HasValue
    {
        get { return _hasValue; }
    }
    public string Value
    {
        get { return _value; }
    }
}

该问题已得到解答(见下文)。 为了澄清,我将发布一个例子。 C# 代码:

using System;
class Program
{
    static void Main(string[] args)
    {
        Nullable<bool> a;
        Nullable<bool> b = null;
    }
}

生成以下 IL:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] valuetype [mscorlib]System.Nullable`1<bool> a,
           [1] valuetype [mscorlib]System.Nullable`1<bool> b)
  IL_0000:  nop
  IL_0001:  ldloca.s   b
  IL_0003:  initobj    valuetype [mscorlib]System.Nullable`1<bool>
  IL_0009:  ret
} // end of method Program::Main

声明 A 和 B,但只初始化 B。

结构在 C# 中真的不能为空吗?

C# 编译器为您提供了一些糖,因此您实际上是在这样做:

Nullable<bool> b = new Nullable<bool>();

这是句法糖

bool? b = null;    
if (b ?? false) 
{
   b = true;
}

C# 有一些语法糖,允许您显示为将可为 null 的类型设置为 null 。 您实际上在幕后所做的是将可为空类型的 HasValue 属性设置为 false

因为您实际上并没有将Nullable<T>变量设置为 null .结构仍然存在。它通过结构中的内部位标志表示null

还有一些编译器糖可以让魔术在幕后发生。

不能将结构设置为 null,但可以进行隐式类型转换,这就是幕后发生的事情。