如何将C#nullable int转换为int

How to convert C# nullable int to int

如何将可为空的int转换为int?假设我有两种类型的int,如下所示:

1
2
int? v1;  
int v2;

我想把v1的价值转让给v2v2 = v1;将导致错误。如何将v1转换为v2


到目前为止,其他答案都是正确的;我只想再加一个稍微干净一点的:

1
v2 = v1 ?? default(int);

任何Nullable都可以隐式转换为其T,前提是要计算的整个表达式决不能导致对值类型的赋值为空。因此,空合并运算符??只是三元运算符的语法sugar:

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开始,Nullable有一个"getValueorDefault()"方法,它是一个空安全getter,基本上执行上面所示的空合并,因此也可以工作:

1
v2 = v1.GetValueOrDefault();


这样地,

1
2
if(v1.HasValue)
   v2=v1.Value


可以使用Value属性进行分配。

1
v2 = v1.Value;


你只需要……

1
v2= v1.GetValueOrDefault();

如果知道v1有值,可以使用Value属性:

1
v2 = v1.Value;

使用GetValueOrDefault方法将指定值(如果有),否则将指定类型的默认值或您指定的默认值:

1
2
3
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value

v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value

您可以使用HasValue属性检查v1是否具有值:

1
2
3
if (v1.HasValue) {
  v2 = v1.Value;
}

还有对GetValueOrDefault(T)方法的语言支持:

1
v2 = v1 ?? -1;


如果v1为空,则不能执行此操作,但可以使用运算符进行检查。

1
v2 = v1 ?? 0;


GetValueOrDefault()

检索对象的值。如果为空,则返回int的默认值,即0。

例子:

v2= v1.GetValueOrDefault();


可以这样执行int nullable to int转换:

1
v2=(int)v1;


v2 = Convert.ToInt32(v1);是可能的


据我所知,最好的解决方案是使用GetValueOrDefault()方法。

1
v2 = v1.GetValueOrDefault();


v1v2之间的简单转换是不可能的,因为v1v2具有更大的值域。这就是v1所能容纳的一切加上null状态。要进行转换,您需要明确说明int中用于映射null状态的值。最简单的方法是??运算符

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()">GetValueOrDefault()返回字段值而不进行任何检查。


根据您的使用环境,您可以使用C 7的模式匹配功能:

1
2
3
4
5
int? v1 = 100;
if (v1 is int v2)
{
    Console.WriteLine($"I'm not nullable anymore: {v2}");
}

编辑:

由于有些人投了反对票而没有留下解释,我想补充一些细节来解释将其作为可行解决方案的理由。

  • C 7的模式匹配现在允许我们检查一个值的类型并隐式转换它。在上面的代码段中,只有当存储在v1中的值与v2的类型兼容时,if条件才会传递,在这种情况下,该类型与int的类型兼容。因此,当v1的值为null时,if条件将失败,因为不能将null赋给int。更确切地说,null不是int

  • 我想强调的是,这个解决方案可能并不总是最佳的选择。正如我建议的,我相信这将取决于开发人员的确切使用环境。如果您已经有了一个int?,并且希望在赋值不为空的情况下(这是唯一一次可以安全地将一个可以为空的int转换为常规int而不会丢失信息)有条件地对其值进行操作,那么模式匹配可能是最简洁的方法之一。


如果不为空,则将v1的值赋给v2,否则取默认值为零。

16

或者下面是写它的另一种方式。

1
v2 = v1.HasValue?v1:0