How to convert C# nullable int to int
如何将可为空的
1 2 | int? v1; int v2; |
我想把
到目前为止,其他答案都是正确的;我只想再加一个稍微干净一点的:
1 | v2 = v1 ?? default(int); |
任何
1 | v2 = v1 == null ? default(int) : v1; |
…这反过来又是if/else的语法sugar:
1 2 3 4 | if(v1==null) v2 = default(int); else v2 = v1; |
另外,从.NET 4.0开始,
1 | v2 = v1.GetValueOrDefault(); |
这样地,
1 2 | if(v1.HasValue) v2=v1.Value |
可以使用Value属性进行分配。
1 | v2 = v1.Value; |
你只需要……
1 | v2= v1.GetValueOrDefault(); |
如果知道
1 | v2 = v1.Value; |
使用
1 2 3 | v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value |
您可以使用
1 2 3 | if (v1.HasValue) { v2 = v1.Value; } |
还有对
1 | v2 = v1 ?? -1; |
如果v1为空,则不能执行此操作,但可以使用运算符进行检查。
1 | v2 = v1 ?? 0; |
GetValueOrDefault()
检索对象的值。如果为空,则返回int的默认值,即0。
例子:
v2= v1.GetValueOrDefault();
可以这样执行int nullable to int转换:
1 | v2=(int)v1; |
用
据我所知,最好的解决方案是使用
1 | v2 = v1.GetValueOrDefault(); |
1 | v2 = v1 ?? 0; // maps null of v1 to 0 |
这也可以用很长的时间来完成。
1 2 3 4 5 6 | int v2; if (v1.HasValue) { v2 = v1.Value; } else { v2 = 0; } |
你可以做到
1 | v2 = v1.HasValue ? v1.Value : v2; |
如果给定类型的默认值是可接受的结果:
1 2 | if (v1.HasValue) v2 = v1.GetValueOrDefault(); |
如果在未定义结果时需要不同的默认值:
1 | v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255 |
如果只希望返回值(无论方法是否失败):
1 | v2 = v1.GetValueOrDefault(); |
< BR>.NET 4.7.2.:.getValueOrDefault()">
根据您的使用环境,您可以使用C 7的模式匹配功能:
1 2 3 4 5 |
编辑:
由于有些人投了反对票而没有留下解释,我想补充一些细节来解释将其作为可行解决方案的理由。
C 7的模式匹配现在允许我们检查一个值的类型并隐式转换它。在上面的代码段中,只有当存储在
v1 中的值与v2 的类型兼容时,if条件才会传递,在这种情况下,该类型与int 的类型兼容。因此,当v1 的值为null 时,if条件将失败,因为不能将null赋给int 。更确切地说,null 不是int 。我想强调的是,这个解决方案可能并不总是最佳的选择。正如我建议的,我相信这将取决于开发人员的确切使用环境。如果您已经有了一个
int? ,并且希望在赋值不为空的情况下(这是唯一一次可以安全地将一个可以为空的int转换为常规int而不会丢失信息)有条件地对其值进行操作,那么模式匹配可能是最简洁的方法之一。
如果不为空,则将
或者下面是写它的另一种方式。
1 | v2 = v1.HasValue?v1:0 |