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

问题描述 投票:0回答:1

给出以下代码示例:

class Value { }

Value? value = null;

if (value is not null)
{
    Value value2 = value;
}
int? value = null;

if (value is not null)
{
    int value2 = value; // CS0266: Cannot implicitly convert type 'int?' to 'int'.
}

我知道这个问题与引用类型与值类型有关。

但是,在这两种情况下,我都会检查

value
是否为 null,那么为什么编译器不能理解第二个示例中 if 块内的值永远不应该为 null?

我可以使用

value.Value
来解决这个问题,但这似乎违反直觉。

如有帮助,我们将不胜感激。

c# visual-studio roslyn
1个回答
0
投票

因为 C#/.NET 中的可空值类型是通过单独的类型 (

Nullable<T>
) 表示的,即
int?
实际上是
Nullable<int>
。您可以使用模式匹配。例如:

if (value is {} value2)
{
    Console.WriteLine(value2);
}

或者

if (value is int value2)
{
    Console.WriteLine(value2);
}

或者只需访问

Nullable.Value
:

if (value is not null)
{
    int value2 = value.Value;
}
另一方面,可空引用类型

不通过单独的类型表示(即,从类型信息的角度来看,string?

string
,可空性信息存储在某种元数据中 - 例如参见
这个答案
),即有人可能会说在这种情况下发生了某种类型擦除。

© www.soinside.com 2019 - 2024. All rights reserved.