无法确定表达式的类型,因为<null>和int之间没有隐式转换
2016-05-10 00:31
543 查看
遇到过好多次的问题了,因为一直忙着码代码,所以没时间去彻底的研究这个问题。
今天实在烦了,就想想了这个问题
下面是代码。
首先是一个实体类,有个 WinningType 字段类型是 int? 的可为空类型
然后我数据库中判断为null的时候之前一直都是这么转换的。
这时候就会报错,为什么呢?最直观的原因就是我们定义的int?可为空类型,而如果这时候数据库有值的话,Convert转换的是int付给了int?的字段。这时候当然会报错了。因为类型根本就是不一样的。
这时候把代码改一下。
三元运算符的逻辑就变成了如果有值的话,那就强转换为int?类型,可空我们定义的相符合,没有值的话就直接赋值为nullok。编译通过。
其他的 double? long?都是同样的问题
其实本来是一个非常简单的面向对象问题,但是因为代码写多了之后这些细节问题都不太注意了。
扩展一点,C#的可为空类型其实就是对应的java的Integer,都是可以直接赋值null给相应的类型,那么反过来就是说int?是引用类型了,我们都知道的是引用类型都是赋值的栈中的一块地址。而我们直接赋值了一个int值当然是会报错的。
写下来,提醒一下自己。
今天实在烦了,就想想了这个问题
下面是代码。
首先是一个实体类,有个 WinningType 字段类型是 int? 的可为空类型
public class Capital { /// <summary> /// key /// </summary> public int SeqId { get; set; } /// <summary> /// 微信Id /// </summary> public int WechatId { get; set; } /// <summary> /// openId /// </summary> public string OpenId { get; set; } /// <summary> /// 获奖类型 /// </summary> public int? WinningType { get; set; } /// <summary> /// 姓名 /// </summary> public string Name { get; set; } /// <summary> /// 姓名 /// </summary> public string Mobile { get; set; } /// <summary> /// 省份 /// </summary> public string Province { get; set; } /// <summary> /// 城市 /// </summary> public string City { get; set; } /// <summary> /// 经销商 /// </summary> public string Distributor { get; set; } /// <summary> /// 创建时间 /// </summary> public string CreateTime { get; set; } }
然后我数据库中判断为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值当然是会报错的。
写下来,提醒一下自己。
相关文章推荐
- TestNG timeOut example(java单元测试@Test timeOut)
- OAuth 2 开发人员指南(Spring security oauth2)
- 用scheme实现KMP算法
- 检查手机网络状态是关网还是GPRS 还是WIFI
- 判断数据库中数据表是否存在
- 重新学javaweb---文件上传监听--进度条
- self和下划线的用法区别
- [kuangbin带你飞]专题十二 基础DP1 I - 最少拦截系统
- ACM小组的队列 coj 1225
- 千回百折:百度Java研发offer斩获记和经验分享
- 【转】如何自己开发一款js或者jquery插件
- Notification集合(一)
- sscanf()的用法
- Testng enabled example
- (原创)OrnLite数据库缓存的介绍以及使用、一对多三级关联表及其CRUD怎删查改等操作demo
- 数据库基本----SQL语句大全
- 国密SM4对称算法实现说明(原SMS4无线局域网算法标准)
- 两个导体盘之间的电场
- sar 找出系统瓶颈的利器
- 文件IO(不带缓存)与标准IO(带缓存流IO)的小结