无法确定表达式的类型,因为和int之间没有隐式转换

遇到过好多次的问题了,因为一直忙着码代码,所以没时间去彻底的研究这个问题。

今天实在烦了,就想想了这个问题


下面是代码。

首先是一个实体类,有个 WinningType 字段类型是 int? 的可为空类型


 
 
  1. public class Capital
  2. {
  3. /// <summary>
  4. /// key
  5. /// </summary>
  6. public int SeqId { get; set; }
  7. /// <summary>
  8. /// 微信Id
  9. /// </summary>
  10. public int WechatId { get; set; }
  11. /// <summary>
  12. /// openId
  13. /// </summary>
  14. public string OpenId { get; set; }
  15. /// <summary>
  16. /// 获奖类型
  17. /// </summary>
  18. public int? WinningType { get; set; }
  19. /// <summary>
  20. /// 姓名
  21. /// </summary>
  22. public string Name { get; set; }
  23. /// <summary>
  24. /// 姓名
  25. /// </summary>
  26. public string Mobile { get; set; }
  27. /// <summary>
  28. /// 省份
  29. /// </summary>
  30. public string Province { get; set; }
  31. /// <summary>
  32. /// 城市
  33. /// </summary>
  34. public string City { get; set; }
  35. /// <summary>
  36. /// 经销商
  37. /// </summary>
  38. public string Distributor { get; set; }
  39. /// <summary>
  40. /// 创建时间
  41. /// </summary>
  42. public string CreateTime { get; set; }
  43. }


然后我数据库中判断为null的时候之前一直都是这么转换的。

WinningType = r["lottery_type"] == DBNull.Value? null : Convert.ToInt32(r["lottery_type"])
 
 

这时候就会报错,为什么呢?最直观的原因就是我们定义的int?可为空类型,而如果这时候数据库有值的话,Convert转换的是int付给了int?的字段。这时候当然会报错了。因为类型根本就是不一样的。

这时候把代码改一下。

WinningType = r["lottery_type"] == DBNull.Value? null : (int?)(r["lottery_type"])
 
 

三元运算符的逻辑就变成了如果有值的话,那就强转换为int?类型,可空我们定义的相符合,没有值的话就直接赋值为nullok。编译通过。

其他的 double? long?都是同样的问题

其实本来是一个非常简单的面向对象问题,但是因为代码写多了之后这些细节问题都不太注意了。

扩展一点,C#的可为空类型其实就是对应的java的Integer,都是可以直接赋值null给相应的类型,那么反过来就是说int?是引用类型了,我们都知道的是引用类型都是赋值的栈中的一块地址。而我们直接赋值了一个int值当然是会报错的。

写下来,提醒一下自己。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值