如何将可空的 int
转换为 int
?假设我有以下两种类型的 int:
int? v1;
int v2;
我想把v1
的值赋给v2
。v2 = v1;
会导致错误。如何将v1
转换为v2
?
v2 = v1 ?? default(int);
任何 Nullable<T>
都可以隐式转换为其 T
,前提是整个表达式的计算结果永远不会导致对 ValueType 的空赋值。因此,空合并运算符 ??
只是三元运算符的语法糖:
v2 = v1 == null ? default(int) : v1.Value;
这实际上是if/else的简写语法:
if(v1==null)
v2 = default(int);
else
v2 = v1.Value;
Nullable<T>
有一个“GetValueOrDefault()”方法,它是一个空值安全的getter,基本上执行了上面所示的null-coalescing操作,因此这也可以工作:v2 = v1.GetValueOrDefault();
default(int)
真的必要吗?使用简单的 0
有什么问题吗? - Cole Tobin像这样,
if(v1.HasValue)
v2=v1.Value
v2 = v1.Value;
v1.HasValue
。 - Yuck你所需要的就是...
v2= v1.GetValueOrDefault();
如果v1为空,你无法这样做,但是你可以使用运算符进行检查。
v2 = v1 ?? 0;
如果你知道v1
有一个值,你可以使用Value
属性:
v2 = v1.Value;
GetValueOrDefault
方法将赋值为该值(如果存在),否则为类型的默认值或您指定的默认值:v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
HasValue
属性来检查v1
是否有值:if (v1.HasValue) {
v2 = v1.Value;
}
此外,GetValueOrDefault(T)
方法也有语言支持:
v2 = v1 ?? -1;
GetValueOrDefault()
GetValueOrDefault()
方法获取对象的值。如果该对象为 null,则返回 int 类型的默认值,即0。
例如:
v2= v1.GetValueOrDefault();
如果给定类型的默认值是可接受的结果:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
如果您希望在结果为未定义时设置不同的默认值:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
v2 = v1.GetValueOrDefault();
.NET 4.7.2: GetValueOrDefault()
方法在不进行任何检查的情况下返回字段值。
根据您的使用情况,您可以使用C# 7的模式匹配功能:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
由于一些人没有留下解释就进行了负评,我想补充一些细节来解释将此作为可行解决方案的理由。
C# 7的模式匹配现在允许我们检查一个值的类型并隐式地强制转换它。在上面的代码片段中,当存储在v1
中的值与v2
的类型兼容时(在本例中是int
),if条件才会通过。因此,当v1
的值为null
时,if条件将失败,因为null
不能赋给int
。更准确地说,null
不是int
。
需要强调的是,这种解决方案可能并不总是最佳选择。正如我所建议的那样,我相信这将取决于开发者的具体使用情境。如果您已经有一个int?
并且希望在分配值不为null时有条件地对其进行操作(这是将可空int转换为常规int而不会丢失信息的唯一安全时间),那么模式匹配可能是最简洁的方法之一。
HasValue
检查的风险。 - minexew我认为最好的解决方案是使用 GetValueOrDefault()
方法。
v2 = v1.GetValueOrDefault();
v1
为null
时,期望的行为是什么? - Solomon Ucko