Linq:无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)
【前言】
最近项目中需要把我们的第一版系统的SQL语句转换成Linq表达式,对于之前没有接触过Linq表达式的我,研究的过程中真的遇到了好多问题!最头疼的就是:
“无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)”
今天就来说说这个令人头疼的bug!
【正文】
一、bug描述:
1、When——何时出现的?
此问题是出现在我写linq表达式中给实体里的“int类型的字段”赋值时出现的问题
2、Why——为什么出现?
(1)、首先看几组图,看完了解“int?”的童鞋就已经大概知道问题所在了
★数据库中的字段设计:
★实体里的设计:
★给实体赋值情况:
int和datetime类型:int?和DateTime?出现
string类型:
(2)、bug文字解说:
int类型的字段在数据库中设计的是“default null”默认为空,而在C#中的int是不能为null的,所以为了解决这个冲突,C#中引入了可空类型,大家也都看到了我赋值时实际上并不是把数据库中的int赋给实体中的int,而是把“int?”赋值给了实体中的int。
所以出现了bug:“无法将类型“int?”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)”
3、How——怎么解决呢?
二、“int?”简析:
1、What——可空类型
2、Where——由来
众所周知,null值用来表示数据类型未被赋予任何值,它是一种引用类型且它只能赋值给引用类型。如果非要把它赋值给值类型int类型的时候,编译器就会报错。
可是又有人会说了,咱们的数据库中int是可以为null的呀,但是C#中int是不能为null的,那怎么办呢?
就为解决“数据库中int可以为null,而C#中int不能为null”的问题,“可空类型”出世了!
3、How——使用
int、bool等这些类型不能表示数据库中的“Null” 。因此C#提供了“可空类型”这种语法,只要在类型后加?就构成了可空的数据类型,比如int?、bool?,这样
int? i=null 就可以了。
最后,如果有想看小菜是如何在linq中出错的详细内容请见下篇博客的更新