本文共 2258 字,大约阅读时间需要 7 分钟。
如何将可空int
转换为int
? 假设我有两种类型的int,如下所示:
int? v1; int v2;
我想将v1
的值分配给v2
。 v2 = v1;
会导致错误。 如何将v1
转换为v2
?
它可以用v2 = Convert.ToInt32(v1);
Int 到int转换可以像这样完成:
v2=(int)v1;
GetValueOrDefault()
检索对象的值。 如果为null,则返回int的默认值,即0。
例:
v2= v1.GetValueOrDefault();
所有你需要的是..
v2= v1.GetValueOrDefault();
如果它不为null,它会将v1
值赋给v2
,否则它将默认值为零。
v2=v1??0
或者下面是写它的另一种方式。
v2 = v1.HasValue?v1:0
就我而言,最好的解决方案是使用GetValueOrDefault()
方法。
v2 = v1.GetValueOrDefault();
根据您的使用情况,您可以使用C#7的模式匹配功能:
int? v1 = 100;if (v1 is int v2){ Console.WriteLine($"I'm not nullable anymore: {v2}");}
由于有些人在没有留下解释的情况下进行了贬低,我想补充一些细节来解释将其作为可行解决方案的理由。
现在允许我们检查值的类型并隐式转换它。 在上面的代码段中,当存储在值如果条件将只通过v1
是类型兼容,为类型v2
,在这种情况下是int
。 因此,当v1
值为null
,if条件将失败,因为null不能分配给int
。 更准确地说, null
不是int
。
我想强调一点,这个解决方案可能并不总是最佳选择。 正如我的建议,我相信这将取决于开发人员的确切使用情况。 如果你已经有一个int?
并且如果指定的值不为null(这是唯一可以将可空int转换为常规int而不丢失信息的唯一时间),则希望有条件地对其值进行操作(此时模式匹配可能是一个)最简洁的方法来做到这一点。
如果给定类型的默认值是可接受的结果:
if (v1.HasValue) v2 = v1.GetValueOrDefault();
如果在未定义结果时需要不同的默认值:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
如果您只想要返回的值(无论方法是否失败):
v2 = v1.GetValueOrDefault();.NET 返回字段值而不进行任何检查。
您可以使用Value属性进行分配。
v2 = v1.Value;
像这样,
if(v1.HasValue) v2=v1.Value
如果v1为null,则不能这样做,但您可以与运营商核实。
v2 = v1 ?? 0;
你可以做到
v2 = v1.HasValue ? v1.Value : v2;
到目前为止,其他答案都是正确的; 我只是想添加一个稍微清洁的东西:
v2 = v1 ?? default(int);
任何Nullable<T>
都可以隐式转换为T
,PROVIDED表示正在计算的整个表达式永远不会导致对ValueType的null赋值。 那么,零合并算子??
只是三元运算符的语法糖:
v2 = v1 == null ? default(int) : v1;
...这又是if / else的语法糖:
if(v1==null) v2 = default(int);else v2 = v1;
此外,从.NET 4.0开始, Nullable<T>
有一个“GetValueOrDefault()”方法,它是一个空的安全getter,基本上执行上面显示的null-coalescing,所以这也适用:
v2 = v1.GetValueOrDefault();
v1
和v2
之间的简单转换是不可能的,因为v1
具有比v2
更大的值域。 它是v1
可以容纳的所有内容加上null
状态。 要转换,您需要显式声明int
哪个值将用于映射null
状态。 最简单的方法是??
操作者
v2 = v1 ?? 0; // maps null of v1 to 0
这也可以以长形式完成
int v2;if (v1.HasValue) { v2 = v1.Value;} else { v2 = 0;}
如果您知道v1
有值,则可以使用Value
属性:
v2 = v1.Value;
使用GetValueOrDefault
方法将分配值(如果有),否则为类型的默认值或您指定的默认值:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no valuev2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
您可以使用HasValue
属性来检查v1
是否具有值:
if (v1.HasValue) { v2 = v1.Value;}
GetValueOrDefault(T)
方法也有语言支持:
v2 = v1 ?? -1;
转载地址:http://ywcnb.baihongyu.com/