给出以下代码示例:
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#/.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
,可空性信息存储在某种元数据中 - 例如参见这个答案),即有人可能会说在这种情况下发生了某种类型擦除。