遇到过好多次的问题了,因为一直忙着码代码,所以没时间去彻底的研究这个问题。
今天实在烦了,就想想了这个问题
下面是代码。
首先是一个实体类,有个 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值当然是会报错的。
写下来,提醒一下自己。