如何将 C# 可为空的 int 转换为 int
本文关键字:int 转换 | 更新日期: 2023-09-27 17:56:27
如何将可为空的int
转换为int
?假设我有 2 种类型的 int,如下所示:
int? v1;
int v2;
我想将v1
的值分配给v2
。 v2 = v1;
将导致错误。如何将v1
转换为v2
?
到目前为止,其他答案都是正确的;我只是想再添加一个稍微干净一点的:
v2 = v1 ?? default(int);
任何Nullable<T>
都可以隐式转换为其T
,前提是被计算的整个表达式永远不会导致对 ValueType 的空赋值。因此,零合并运算符??
只是三元运算符的语法糖:
v2 = v1 == null ? default(int) : v1.Value;
。这反过来又是 if/else 的语法糖:
if(v1==null)
v2 = default(int);
else
v2 = v1.Value;
<小时 />此外,从 .NET 4.0 开始,Nullable<T>
有一个"GetValueOrDefault()"方法,这是一个空安全 getter,基本上执行上面显示的空合并,所以这也有效:
v2 = v1.GetValueOrDefault();
像这样,
if(v1.HasValue)
v2=v1.Value
可以使用 Value 属性进行赋值。
v2 = v1.Value;
你所需要的只是..
v2= v1.GetValueOrDefault();
如果 v1 为 null,则无法执行此操作,但可以与运算符联系。
v2 = v1 ?? 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;
GetValueOrDefault()
检索对象的值。如果为 null,则返回默认值 int ,即 0。
例:
v2= v1.GetValueOrDefault();
如果给定类型的默认值是可接受的结果:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
如果在结果未定义时需要不同的默认值:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
如果您只想返回值(无论方法是否失败):
v2 = v1.GetValueOrDefault();
.NET 4.7.2.:GetValueOrDefault()
返回字段值而不进行任何检查。
我而言,最好的解决方案是使用GetValueOrDefault()
方法。
v2 = v1.GetValueOrDefault();
根据您的使用上下文,您可以使用 C# 7 的模式匹配功能:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
编辑:
由于有些人在没有留下解释的情况下投了反对票,我想添加一些细节来解释将其作为可行解决方案的理由。
C# 7 的模式匹配现在允许我们检查值的类型并隐式强制转换它。在上面的代码片段中,只有当存储在
v1
中的值与 for 的类型兼容时,if 条件才会传递v2
的类型,在本例中为int
。因此,当v1
的值null
时,if条件将失败,因为不能将null分配给int
。更准确地说,null
不是int
.我想强调的是,这种解决方案可能并不总是最佳选择。正如我所建议的,我相信这将取决于开发人员的确切使用环境。如果您已经有一个
int?
并且想要有条件地对其值进行操作 if-and-only-if 分配的值不为 null(这是在不丢失信息的情况下将可为 null 的 int 转换为常规 int 的唯一安全时间),那么模式匹配可能是执行此操作的最简洁的方法之一。
Int null 到 int 的转换可以像这样完成:
v2=(int)v1;
在 C# 7.1 及更高版本中,可以使用 default
文本而不是 default
运算符来推断类型,因此可以按如下方式编写:
v2 = v1 ?? default;
你可以做
v2 = v1.HasValue ? v1.Value : v2;
v2 = Convert.ToInt32(v1);
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;
}
它不为 null,它将v1
的值分配给v2
,否则它将采用默认值为零。
v2=v1??0
或者下面是另一种写法。
v2 = v1.HasValue?v1:0
可以使用以下任何一种转换方法完成:
v2 = Convert.ToInt32(v1);
v2 = (int)v1;
v2 = v1.GetValueOrDefault();
v2 = v1.HasValue ? v1:0;
int v2= Int32.Parse(v1.ToString());
我正在研究 C# 9 和 .NET 5,示例
foo
可为空的 int,我需要获取 int 值 foo
var foo = (context as AccountTransfer).TransferSide;
int value2 = 0;
if (foo != null)
{
value2 = foo.Value;
}
在 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types#examination-of-an-instance-of-a-nullable-value-type 查看更多信息
Normal TypeConversion 将抛出异常
例如:
int y = 5;
int? x = null;
y = x.value; //It will throw "Nullable object must have a value"
Console.WriteLine(y);
使用Convert.ToInt32()
方法
int y = 5;
int? x = null;
y = x.Convert.ToInt32(x);
Console.WriteLine(y);
这将返回 0 作为输出,因为 y 是一个整数。