到目前为止的其他答案都是正确的;我只是想再添加一个稍微干净一点的:
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()”方法,它是一个 null 安全的 getter,基本上执行上面显示的 null 合并,所以这也有效:
v2 = v1.GetValueOrDefault();
像这样,
if(v1.HasValue)
v2=v1.Value
您可以使用 Value 属性进行赋值。
v2 = v1.Value;
v1.HasValue
。
所有你需要的是..
v2= v1.GetValueOrDefault();
如果 v1 为空,则无法执行此操作,但您可以通过操作员进行检查。
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;
获取值或默认值()
检索对象的值。如果为 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 中存储的值与 v2 的类型兼容时,if 条件才会通过,在本例中为 int。因此,当 v1 的值为 null 时,if 条件将失败,因为 null 不能分配给 int。更准确地说,null 不是 int。
我想强调的是,这种解决方案可能并不总是最佳选择。正如我所建议的,我相信这将取决于开发人员的确切使用上下文。如果你已经有一个 int?并且想要有条件地对其值进行操作,当且仅当分配的值不为空时(这是唯一一次可以安全地将可为空的 int 转换为常规 int 而不会丢失信息),那么模式匹配可能是一个最简洁的方法来做到这一点。
HasValue
检查的风险。
Int nullable 到 int 的转换可以这样完成:
v2=(int)v1;
v2 = Convert.ToInt32(v1);
有可能
你可以做
v2 = v1.HasValue ? v1.Value : v2;
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
不为空,它会将 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,我需要获取 foo
的 int 值
var foo = (context as AccountTransfer).TransferSide;
int value2 = 0;
if (foo != null)
{
value2 = foo.Value;
}
普通的 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 是一个整数。
x.Convert
,请修复提供的示例。
default(int)
真的需要吗?一个简单的0
有什么问题?default
。零作为值并不总是有效的,更不用说默认值了,因此如果您将int
替换为通用T
,您会发现我的代码有效,而零无效。在某些未来的框架版本中,default
也可能变得可重载;如果发生这种情况,使用默认值的代码将很容易利用,而显式的 null 或零分配将不得不更改。