可空类型的赋值问题!

超凡 2011-06-21 09:49:53


info.P03_1400PassRate = row[9].ToString() == "" ? null : Convert.ToDouble(row[9].ToString());
info.P03_1200Input = row[10].ToString() == "" ? null : Convert.ToDouble(row[10].ToString());
info.P03_1200Rework = row[11].ToString() == "" ? null : Convert.ToDouble(row[11].ToString());
可空类型在三元后面强转为什么会报错?

无法确定条件表达式类型,因为<null>和double之间没有稳式转换!

...全文
668 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmin 2012-05-21
  • 打赏
  • 举报
回复
(int?)null
kshxy 2012-05-16
  • 打赏
  • 举报
回复
int? x=null;

int? y = (3>2)?x:0;
lihanbing 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 hncelfhv 的回复:]
那为null不能赋值,设为可空类型有啥意义?

我知道是三元中两个值的类型有错! 但可空类型应该是null和double类型都能接收的! 你把两个值单独赋值是没错的!

用if判断之后单独赋值是没错!但在三元中这样表现就有错!想不通啥原因!
[/Quote]

你还在纠结于这个问题啊,最后解释一次,不再回了

先明确一个概念,3元表达式里面的“?:”是一个运算符,而不能简单的理解为条件赋值语句;
其次 "double?" 和 "double" 对编译器来说是两种不同的类型,他们之间也需要转换才能赋值的,这不是重点。

再说这个3元表达式“a=b?c:d”,他并不是简单的把c或者d直接赋值给a,c和d首先要进行一个“运算”,“运算”结果值是根据b等于c或者d,然后再将这个结果值赋值给a

“?:”和+、-、*、/这些运算符一样,在进行运算的时候,不能直接对两个不同类型的操作数进行运算,需要先转换成相同的类型。

在你这个例子里 参与表达式的类型分别是 double? = bool ? null : double;

编译器首先要将后面两个操作数进行一致性转换,编译器会选择转换到一个优先级较高的类型,这里就是double型,null可以转换到double? 但是不能到double,所以当null转换成double时报错了

你这里出错是出在后面两个操作数互相转换时,而不是最终结果赋值的时候,所以只要让后面两个操作数可以互相转换问题就解决了

  info.P03_1400PassRate = row[9].ToString() == "" ? (double?)null : Convert.ToDouble(row[9].ToString());

info.P03_1400PassRate = row[9].ToString() == "" ? null : (double?)Convert.ToDouble(row[9].ToString());
都可以


但愿你能看明白
lihanbing 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 learn_2010 的回复:]

是不是这样的问题:

double d = null; 出错。
可以写成 double d = double.NaN;
[/Quote]

+1

这个可以有
info.P03_1400PassRate = row[9].ToString() == "" ? double.NaN : Convert.ToDouble(row[9].ToString());

这就实现你要的可空类型了
porschev 2011-06-21
  • 打赏
  • 举报
回复

这样形式

info.P03_1400PassRate = row[9].ToString() == "" ? null : Convert.ToDouble(row[9].ToString());

改成

info.P03_1400PassRate = row[9] == null ? "": Convert.ToDouble(row[9].ToString());
sugarbelle 2011-06-21
  • 打赏
  • 举报
回复
最好用括号把判断括起来.
Jefferson-zh 2011-06-21
  • 打赏
  • 举报
回复
是不是这样的问题:

double d = null; 出错。
可以写成 double d = double.NaN;
老毕 2011-06-21
  • 打赏
  • 举报
回复
info.P03_1200Input = row[10].ToString() == "" ? null : Convert.ToDouble(row[10].ToString());


就想问一下,赋值式左边的变量不是double类型的吧?如果是double,如果右边刚好返回null,应该会出现楼主遇到的错误提示。
lihanbing 2011-06-21
  • 打赏
  • 举报
回复
实体类对应的实体应该是个数据库表吧,数据库里的字段是可以设置为可空类型的,这没问题,但你这个实体类是c#代码写的,就需要遵循c#的语法规范,不管info.P03_1400PassRate 是个字段还是个属性,可以确定它的类型定义是double的(根据你的错误提示“无法确定条件表达式类型,因为<null>和double之间没有稳式转换!”),而double是不可以等于null的,就这么简单
超凡 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lihanbing 的回复:]
可空类型!先搞清楚你在哪设置的可空类型
[/Quote]

我那个是实体类! 肯定在实体中设置的...
lihanbing 2011-06-21
  • 打赏
  • 举报
回复
可空类型!先搞清楚你在哪设置的可空类型
超凡 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lihanbing 的回复:]
可以改成这样,语法检查就不会报错了

C# code

info.P03_1400PassRate = row[9].ToString() == "" ? 0 : Convert.ToDouble(row[9].ToString());
[/Quote]

我知道这样可以!但改成这样,我设为可空类型有什么意义!
超凡 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 sugarbelle 的回复:]
比如你返回0 或者返回1 是可以的.
返回 0 或者返回"abc" 这样是不可以的. 不是同样的类型.
所以 返回null或者返回double 这样是不可以的.
[/Quote]

那为null不能赋值,设为可空类型有啥意义?

我知道是三元中两个值的类型有错! 但可空类型应该是null和double类型都能接收的! 你把两个值单独赋值是没错的!

用if判断之后单独赋值是没错!但在三元中这样表现就有错!想不通啥原因!
超凡 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 sugarbelle 的回复:]
不管你前面 是什么

xxx=xxx? null : double;

这样就是错的.
两个返回.一个是null.一个是double.不可能同时接收这样的.如果是null就不可能是double.如果是double就不可能是null.
你把它们写一块就错了.
就好像返回true或者false一样. true和false类型必须是一样的bool类型.
你不能返回true或者abc.
[/Quote]

但可空类型是可以接受null值的!
tashiwoweiyi 2011-06-21
  • 打赏
  • 举报
回复


//P03_1400PassRate、P03_1200Input、P03_1200Rework这三个值看你的代码应该是Double类型吧。

//直接用TryParse转换就好,,,如果row里面的值为空,或是报错那返回初始值,0.。。。double的变量值是不能为null的。
double P03_1400PassRate = 0;
double.TryParse(row[9].ToString(), out P03_1400PassRate);
double P03_1200Input = 0;
double.TryParse(row[10].ToString(), out P03_1200Input);
double P03_1200Rework = 0;
double.TryParse(row[11].ToString(), out P03_1200Rework);

info.P03_1400PassRate = P03_1400PassRate;
info.P03_1200Input = P03_1200Input;
info.P03_1200Rework = P03_1200Rework;
超凡 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lihanbing 的回复:]
你这个P03_1400PassRate是什么类型?
看代码貌似是double的,double不能设为null
[/Quote]

我是可空类型! 汗!
超凡 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]
应该是你的row[9]为空,你应该先判断一下
[/Quote]


我用的三元判断的! 汗!没看清楚!
超凡 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 flyerwing 的回复:]
info.P03_1400PassRate = row[9]==null? "" : Convert.ToDouble(row[9].ToString());
[/Quote]
哥,可空类型可以赋""吗?
woshiliourun 2011-06-21
  • 打赏
  • 举报
回复
最好 在数据库设计是给予赋 默认值·开始 赋予 “空··”
lihanbing 2011-06-21
  • 打赏
  • 举报
回复
可以改成这样,语法检查就不会报错了

info.P03_1400PassRate = row[9].ToString() == "" ? 0 : Convert.ToDouble(row[9].ToString());
加载更多回复(29)

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧