博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何将C#nullable int转换为int
阅读量:2289 次
发布时间:2019-05-09

本文共 2258 字,大约阅读时间需要 7 分钟。

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

int? v1;  int v2;

我想将v1的值分配给v2v2 = v1; 会导致错误。 如何将v1转换为v2


#1楼

它可以用v2 = Convert.ToInt32(v1);


#2楼

Int 到int转换可以像这样完成:

v2=(int)v1;

#3楼

GetValueOrDefault()

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

例:

v2= v1.GetValueOrDefault();


#4楼

所有你需要的是..

v2= v1.GetValueOrDefault();

#5楼

如果它不为null,它会将v1值赋给v2 ,否则它将默认值为零。

v2=v1??0

或者下面是写它的另一种方式。

v2 = v1.HasValue?v1:0

#6楼

就我而言,最好的解决方案是使用GetValueOrDefault()方法。

v2 = v1.GetValueOrDefault();

#7楼

根据您的使用情况,您可以使用C#7的模式匹配功能:

int? v1 = 100;if (v1 is int v2){    Console.WriteLine($"I'm not nullable anymore: {v2}");}

编辑:

由于有些人在没有留下解释的情况下进行了贬低,我想补充一些细节来解释将其作为可行解决方案的理由。

  • 现在允许我们检查值的类型并隐式转换它。 在上面的代码段中,当存储在值如果条件将只通过v1是类型兼容,为类型v2 ,在这种情况下是int 。 因此,当v1值为null ,if条件将失败,因为null不能分配给int 。 更准确地说, null不是int

  • 我想强调一点,这个解决方案可能并不总是最佳选择。 正如我的建议,我相信这将取决于开发人员的确切使用情况。 如果你已经有一个int? 并且如果指定的值不为null(这是唯一可以将可空int转换为常规int而不丢失信息的唯一时间),则希望有条件地对其值进行操作(此时模式匹配可能是一个)最简洁的方法来做到这一点。


#8楼

如果给定类型的默认值是可接受的结果:

if (v1.HasValue)    v2 = v1.GetValueOrDefault();

如果在未定义结果时需要不同的默认值:

v2 = v1.GetValueOrDefault(255);    // or any valid value for int in place of 255

如果您只想要返回的值(无论方法是否失败):

v2 = v1.GetValueOrDefault();

.NET 返回字段值而不进行任何检查。


#9楼

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

v2 = v1.Value;

#10楼

像这样,

if(v1.HasValue)   v2=v1.Value

#11楼

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

v2 = v1 ?? 0;

#12楼

你可以做到

v2 = v1.HasValue ? v1.Value : v2;

#13楼

到目前为止,其他答案都是正确的; 我只是想添加一个稍微清洁的东西:

v2 = v1 ?? default(int);

任何Nullable<T>都可以隐式转换为T ,PROVIDED表示正在计算的整个表达式永远不会导致对ValueType的null赋值。 那么,零合并算子?? 只是三元运算符的语法糖:

v2 = v1 == null ? default(int) : v1;

...这又是if / else的语法糖:

if(v1==null)   v2 = default(int);else   v2 = v1;

此外,从.NET 4.0开始, Nullable<T>有一个“GetValueOrDefault()”方法,它是一个空的安全getter,基本上执行上面显示的null-coalescing,所以这也适用:

v2 = v1.GetValueOrDefault();

#14楼

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

#15楼

如果您知道v1有值,则可以使用Value属性:

v2 = v1.Value;

使用GetValueOrDefault方法将分配值(如果有),否则为类型的默认值或您指定的默认值:

v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no valuev2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value

您可以使用HasValue属性来检查v1是否具有值:

if (v1.HasValue) {  v2 = v1.Value;}

GetValueOrDefault(T)方法也有语言支持:

v2 = v1 ?? -1;

转载地址:http://ywcnb.baihongyu.com/

你可能感兴趣的文章
UML在关系型数据库设计中的应用
查看>>
Hibernate为什么如此流行?
查看>>
rosdep init 或者rosdep update 连接错误的解决办法
查看>>
Gitlab 更新后gitlab-ctl reconfigure 提示 can only have one web server puma unicorn 错误
查看>>
videoc_streamon error 28, NO space left on device解决办法
查看>>
一个比make更好用的编译工具
查看>>
降低windows系统里面usb转串口模块延时的办法
查看>>
ROS 常用加速指令
查看>>
ubuntu ssh登入速度太慢的解决办法
查看>>
罕见bug解决办法: kienct 1代运行错误Failed to claim camera interface: LIBUSB_ERROR_NOT_FOUND
查看>>
rviz的简单使用
查看>>
解决ROS的usb_cam节点无法正常读取mjpeg格式摄像头的方法
查看>>
Ubuntu VNC 如何调整分辨率
查看>>
病毒编程技术-3
查看>>
病毒编程技术-4
查看>>
病毒编程技术-5
查看>>
第9周上机实践项目1——利用循环求和
查看>>
第9周上机实践项目2——分数的累加
查看>>
第9周上机实践项目3——输出星号图
查看>>
第9周上机实践项目4——乘法口诀表
查看>>