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

kat*_*kak 1 c# nullable visual-studio roslyn nullable-reference-types

给出以下代码示例:

class Value { }

Value? value = null;

if (value is not null)
{
    Value value2 = value;
}
Run Code Online (Sandbox Code Playgroud)
int? value = null;

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

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

但是,在这两种情况下,我都检查是否value为 null,那么为什么编译器不能理解第二个示例中 if 块内的值永远不应该为 null?

我可以通过使用来解决这个问题value.Value,但这似乎违反直觉。

如有帮助,将不胜感激。

Gur*_*ron 5

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

if (value is {} value2)
{
    Console.WriteLine(value2);
}
Run Code Online (Sandbox Code Playgroud)

或者

if (value is {} value2)
{
    Console.WriteLine(value2);
}
Run Code Online (Sandbox Code Playgroud)

或者只需访问Nullable.Value

if (value is not null)
{
    int value2 = value.Value;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,可空引用类型string?不是通过单独的类型表示的(即从类型信息的角度来看,可string空性信息存储在某种元数据中 - 例如参见这个答案),即人们可能会认为某种在这种情况下发生类型擦除。