如何将C#nullable int转换为int

Ken*_*hou 445 c# nullable

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

int? v1;  
int v2; 
Run Code Online (Sandbox Code Playgroud)

我想分配给它v1的价值v2.v2 = v1;会导致错误.我如何转换v1v2

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)

  • 真的需要“ default(int)”吗?简单的“ 0”怎么了? (3认同)
  • 根据 VS2019 建议 v2 = v1 ?? 默认; (3认同)
  • 在这个例子中可以使用,但是在一般情况下,建议在适当的地方使用“ default”。零并不总是有效的值,更不用说默认值了,所以如果用通用的T代替int,我的代码会工作,而零则无效。在某些将来的框架版本中,“ default”也可能变得可重载;如果发生这种情况,那么使用default的代码将很容易利用,而显式的null或0分配则必须更改。 (2认同)
  • 这应该升到顶端:.NET 4.0,Nullable <T>有一个"GetValueOrDefault()" (2认同)

Sri*_*thy 156

像这样,

if(v1.HasValue)
   v2=v1.Value
Run Code Online (Sandbox Code Playgroud)


e36*_*6M3 84

您可以使用Value属性进行分配.

v2 = v1.Value;
Run Code Online (Sandbox Code Playgroud)

  • 并确保首先检查`v1.HasValue`. (12认同)
  • 另外 - 如果您不确定v1是否包含null - 您可以使用null-coalescing运算符来设置回退值.例如v2 = v1 ?? 0; (8认同)
  • @ventiseis我会认为这是理想的行为 - 我很惊讶很多其他的答案都可以通过静默将null转换为0.如果你将一个可空类型分配给一个非可空类型,你应该确定该值实际上不为null.OP没有说"我想将v1分配给v2,如果v1为空则为0",但这就是每个人似乎都假设的 (6认同)
  • [MSDN](https://msdn.microsoft.com/de-de/library/ydkbatt6(v = vs.110).aspx)说,如果`v1`为'null`,这将抛出异常.在我看来,这不是一个正确的答案. (3认同)

the*_*tar 73

所有你需要的是..

v2= v1.GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果为 null,则返回 0 (2认同)

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)


Art*_*nez 44

如果v1为null,则不能这样做,但您可以与运营商核实.

v2 = v1 ?? 0;
Run Code Online (Sandbox Code Playgroud)


Ani*_*rma 27

GetValueOrDefault()

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

例:

v2= v1.GetValueOrDefault();


小智 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 255
Run 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)

  • 如果v1为null,则会导致InvalidOperationException. (9认同)

ake*_*den 11

在 C# 7.1 及更高版本中,可以使用default文字而不是default运算符来推断类型,因此可以编写如下:

v2 = v1 ?? default;
Run Code Online (Sandbox Code Playgroud)


Rev*_*Rev 10

这是可能的 v2 = Convert.ToInt32(v1);


FIr*_*nda 9

你可以做到

v2 = v1.HasValue ? v1.Value : v2;
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 9

之间的简单的转换v1v2是不可能的,因为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)


Nic*_*ler 9

根据您的使用环境,您可以使用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而不会丢失信息的情况),那么模式匹配也许是最简洁的方法之一。