Answers:
到目前为止,其他答案都是正确的。我只想再添加一个稍微干净一点的:
v2 = v1 ?? default(int);
Any Nullable<T>
可以隐式转换为它的T
,条件是要求值的整个表达式永远不会导致对ValueType的空赋值。因此,null-coalescing运算符??
只是三元运算符的语法糖:
v2 = v1 == null ? default(int) : v1;
...这反过来是if / else的语法糖:
if(v1==null)
v2 = default(int);
else
v2 = v1;
而且,从.NET 4.0开始,Nullable<T>
具有“ GetValueOrDefault()”方法,该方法是一个空值安全的获取器,基本上执行上面显示的空值合并,因此也可以使用:
v2 = v1.GetValueOrDefault();
default(int)
真的需要?简单有什么问题0
?
default
在适当的地方使用。零并不总是有效的值,更不用说默认值了,因此,如果int
用泛型替换,T
我的代码会工作而零则无效。在某些将来的框架版本中,default
也可能变得可重载;如果发生这种情况,那么使用default的代码将很容易利用,而显式的null或0分配则必须更改。
像这样,
if(v1.HasValue)
v2=v1.Value
您可以使用Value属性进行分配。
v2 = v1.Value;
v1.HasValue
要先检查。
如果您知道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;
如果v1为null,则无法执行此操作,但可以与运算符联系。
v2 = v1 ?? 0;
如果给定类型的默认值是可接受的结果:
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
。因此,当for的值为v1
is时null
,if条件将失败,因为无法将null分配给int
。更恰当的null
是,不是int
。
我想强调一点,这种解决方案可能并不总是最佳选择。正如我建议的那样,我相信这将取决于开发人员的确切使用情况。如果您已经有一个int?
并且想要有条件地对它的值进行if-and-only-(如果分配的值不为null)(这是唯一可以安全地将可为null的int转换为常规int而不会丢失信息的情况),那么模式匹配也许是最简洁的方法之一。
HasValue
支票的风险。
在C#7.1和更高版本中,可以通过使用default
文字而不是default
运算符来推断类型,因此可以如下编写:
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
是期望的行为null
?