Visual Studio 为什么空性检查不适用于值类型?

00jrzges  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(123)

下面的代码示例如下:

  1. class Value { }
  2. Value? value = null;
  3. if (value is not null)
  4. {
  5. Value value2 = value;
  6. }

个字符
我理解这个问题与引用类型和值类型有关。
然而,在这两种情况下,我都在检查value是否为null,那么为什么编译器不能理解第二个例子中if块中的value永远不应该为null?
我可以通过使用value.Value来解决这个问题,但这似乎违反直觉。
希望你能帮忙。

hs1rzwqc

hs1rzwqc1#

因为C#/.NET中的nullable value types是通过一个单独的类型(Nullable<T>)表示的,即int?实际上是Nullable<int>。你可以使用模式匹配。例如:

  1. if (value is {} value2)
  2. {
  3. Console.WriteLine(value2);
  4. }

字符串

  1. if (value is int value2)
  2. {
  3. Console.WriteLine(value2);
  4. }


或者直接访问Nullable.Value

  1. if (value is not null)
  2. {
  3. int value2 = value.Value;
  4. }


另一方面,Nullable references types不通过单独的类型来表示(即,从类型信息的Angular 来看,string?string,并且可空性信息存储在某种元数据中-例如参见this answer),即,可以认为在这种情况下发生了某种类型的擦除。

展开查看全部

相关问题