如何将可空转换int成int?假设我有两种类型的int,如下所示:
int? v1;
int v2;
Run Code Online (Sandbox Code Playgroud)
我想分配给它v1的价值v2.v2 = v1;会导致错误.我如何转换v1为v2?
Kei*_*thS 596
到目前为止,其他答案都是正确的; 我只是想添加一个稍微清洁的东西:
v2 = v1 ?? default(int);
Run Code Online (Sandbox Code Playgroud)
Any Nullable<T>可以隐式转换为它T,PROVIDED表示正在计算的整个表达式永远不会导致对ValueType的null赋值.因此,null-coalescing运算符??只是三元运算符的语法糖:
v2 = v1 == null ? default(int) : v1;
Run Code Online (Sandbox Code Playgroud)
...这又是if/else的语法糖:
if(v1==null)
v2 = default(int);
else
v2 = v1;
Run Code Online (Sandbox Code Playgroud)
此外,从.NET 4.0开始,Nullable<T>有一个"GetValueOrDefault()"方法,它是一个空的安全getter,基本上执行上面显示的null-coalescing,所以这也适用:
v2 = v1.GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)
e36*_*6M3 84
您可以使用Value属性进行分配.
v2 = v1.Value;
Run Code Online (Sandbox Code Playgroud)
the*_*tar 73
所有你需要的是..
v2= v1.GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)
Guf*_*ffa 47
如果您知道它v1有值,您可以使用该Value属性:
v2 = v1.Value;
Run Code Online (Sandbox Code Playgroud)
GetValueOrDefault如果存在值,则使用该方法将分配值,否则为类型的默认值或您指定的默认值:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
Run Code Online (Sandbox Code Playgroud)
您可以使用该HasValue属性来检查是否v1有值:
if (v1.HasValue) {
v2 = v1.Value;
}
Run Code Online (Sandbox Code Playgroud)
该方法还有语言支持GetValueOrDefault(T):
v2 = v1 ?? -1;
Run Code Online (Sandbox Code Playgroud)
小智 13
如果给定类型的默认值是可接受的结果:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();Run Code Online (Sandbox Code Playgroud)
如果在未定义结果时需要不同的默认值:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255Run Code Online (Sandbox Code Playgroud)
如果您只想要返回的值(无论方法是否失败):
v2 = v1.GetValueOrDefault();Run Code Online (Sandbox Code Playgroud)
.NET 4.7.2.:不GetValueOrDefault()返回任何检查返回字段值.
Mas*_*ian 12
就我而言,最好的解决方案是使用GetValueOrDefault()方法.
v2 = v1.GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)
Kri*_*ppa 11
Int nullable到int转换可以像这样完成:
v2=(int)v1;
Run Code Online (Sandbox Code Playgroud)
ake*_*den 11
在 C# 7.1 及更高版本中,可以使用default文字而不是default运算符来推断类型,因此可以编写如下:
v2 = v1 ?? default;
Run Code Online (Sandbox Code Playgroud)
之间的简单的转换v1和v2是不可能的,因为v1具有比的值的较大的域v2.这一切都v1可以持有加上null国家.要进行转换,您需要明确说明int将用于映射null状态的值.最简单的方法是??操作员
v2 = v1 ?? 0; // maps null of v1 to 0
Run Code Online (Sandbox Code Playgroud)
这也可以以长形式完成
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
Run Code Online (Sandbox Code Playgroud)
根据您的使用环境,您可以使用C#7的模式匹配功能:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
Run Code Online (Sandbox Code Playgroud)
由于有些人在不加解释的情况下不满意,我想添加一些细节来解释将其作为可行解决方案的理由。
C#7的模式匹配现在允许我们检查值的类型并将其隐式转换。在上面的代码段中,当存储在值如果条件将只传递v1的类型兼容的该类型v2,在这种情况下是int。因此,当for的值为v1is时null,if条件将失败,因为无法将null分配给int。更恰当的null是,不是int。
我想强调一点,该解决方案可能并不总是最佳选择。正如我建议的那样,我相信这将取决于开发人员的确切使用情况。如果您已经有一个int?并且想要有条件地对它的值进行if-and-only-(如果分配的值不为null)(这是唯一可以安全地将可空int转换为常规int而不会丢失信息的情况),那么模式匹配也许是最简洁的方法之一。