如何将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
有什么问题吗?在本例中可以使用,但在一般情况下建议