如何将C#nullable int转换为int

如何将C#nullable int转换为int,c#,nullable,C#,Nullable,如何将可为空的int转换为int?假设我有两种int类型,如下所示: int? v1; int v2; v2 = v1 ?? default; 我想将v1的值分配给v2v2=v1将导致错误。如何将v1转换为v2?您可以使用Value属性进行赋值 v2 = v1.Value; 像这样, if(v1.HasValue) v2=v1.Value 如果v1为空,则无法执行此操作,但可以与运算符进行检查 v2 = v1 ?? 0; 你可以 v2 = v1.HasValue ? v1.V

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

int? v1;  
int v2; 
v2 = v1 ?? default;

我想将
v1
的值分配给
v2
<代码>v2=v1将导致错误。如何将
v1
转换为
v2

您可以使用Value属性进行赋值

v2 = v1.Value;
像这样,

if(v1.HasValue)
   v2=v1.Value

如果v1为空,则无法执行此操作,但可以与运算符进行检查

v2 = v1 ?? 0;
你可以

v2 = v1.HasValue ? v1.Value : v2;

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

v2 = v1 ?? default(int);
任何
Nullable
都可以隐式转换为其
T
,前提是要计算的整个表达式永远不会导致对ValueType的null赋值。因此,空合并运算符
只是三元运算符的语法糖:

v2 = v1 == null ? default(int) : v1.Value;
…这又是if/else的语法:

if(v1==null)
   v2 = default(int);
else
   v2 = v1.Value;

另外,从.NET 4.0开始,
Nullable
有一个“GetValueOrDefault()”方法,它是一个空安全的getter,基本上执行上面所示的空合并,因此它也可以工作:

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 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;

可以使用
v2=Convert.ToInt32(v1)

可以按如下方式进行Int-nullable到Int的转换:

v2=(int)v1;
GetValueOrDefault()

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

例如:

v2=v1.GetValueOrDefault()

你所需要的只是

v2= v1.GetValueOrDefault();

如果
v1
的值不为空,它会将
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
    的类型兼容时,if条件才会通过,在本例中为
    int
    。因此,当
    v1
    的值为
    null
    时,if条件将失败,因为null不能分配给
    int
    。更恰当地说,
    null
    不是
    int

  • 我想强调的是,这个解决方案可能并不总是最佳选择。正如我所建议的,我相信这将取决于开发人员的确切使用上下文。如果您已经有了一个
    int?
    ,并且仅当指定的值不为null时(这是唯一一次在不丢失信息的情况下将可为null的int转换为常规int是安全的),那么模式匹配可能是最简洁的方法之一


如果给定类型的默认值是可接受的结果:

if (v1.HasValue)
    v2 = v1.GetValueOrDefault();
如果在结果未定义时需要不同的默认值:

v2 = v1.GetValueOrDefault(255);    // or any valid value for int in place of 255
如果只希望返回值(无论方法是否失败):


.NET 4.7.2.:返回字段值而不进行任何检查。

在C#7.1及更高版本中,可以使用而不是来推断类型,因此可以按如下方式写入:

int? v1;  
int v2; 
 int v2= Int32.Parse(v1.ToString());
v2 = v1 ?? default;
例如,我正在研究C#9和.NET5

foo
是可为空的int,我需要获取
foo的int值

var foo=(上下文为AccountTransfer);
整数值2=0;
如果(foo!=null)
{
value2=食品价值;
}

有关详细信息,请参见

可以使用以下任何转换方法进行转换:

v2=Convert.ToInt32(v1)

v2=(int)v1

v2=v1.GetValueOrDefault()


v2=v1.HasValue?v1:0

正常类型转换将引发异常

例如:

inty=5;
智力?x=零;
y=x.0值//它将抛出“可空对象必须有值”
控制台写入线(y);
使用
Convert.ToInt32()
方法

int y = 5;    
int? x = null;    
y = x.Convert.ToInt32(x);    
Console.WriteLine(y);

这将返回0作为输出,因为y是一个整数。

此外,如果不确定v1是否包含null,可以使用null合并运算符设置回退值。例如,v2=v1??0;并确保首先检查
v1.HasValue
。表示如果
v1
null
,则会引发异常。在我看来,这不是一个正确的答案。@ventiseis我认为这是一个可取的行为——我很惊讶这么多其他答案都可以将空值默默地转换为0。如果要将可为null的类型分配给不可为null的类型,则应确保该值实际上不是null。OP没有说“我想把v1分配给v2,或者如果v1为空,则分配0”,但这似乎是每个人都认为真正需要的
default(int)
?简单的
0
有什么问题吗?在本例中可以使用,但在一般情况下建议