[英]? Operator VS ?? Operator Usage
以下声明有效:
Class.ID = odrDataReader["ID"] == null ? 0 : Convert.ToInt32(odrDataReader["ID"]);
但以下不是:
Class.ID = odrDataReader["ID"] as int? ?? 0; //ID is always 0
谁能解释为什么? 即使ID列不为空,运算符也始终返回0?
解决方案(Kirk建议):
Class.ID = Convert.ToInt32(odrDataReader["ID"] ?? 0);
在第一个中你使用Convert.ToInt32(odrDataReader["ID"])
在第二个你使用odrDataReader["ID"] as int?
。 从你说的第一个是正确的,所以你也应该在第二个使用转换。
Actualy我认为首先是好的,因为如果你真的想使用它会看起来很奇怪? 运营商。
编辑 :将odrDataReader["ID"] as int?
不是转换。 如果odrDataReader [“ID”]是字符串,它将始终返回null。
这一切都取决于ID
列的类型。 如果确实是int?
类型int?
,那么你应该能够毫无问题地做到这一点:
Class.ID = (int?)odrDataReader["ID"] ?? 0;
然而,更有可能的情况并非如此,并且是一种不同的类型(我猜猜string
)。 string
显然不是int?
因此odrDataReader["ID"] as int?
始终返回null
并获得值0
。 正如Euphoric所提到的as
, as
运算符只能进行引用/装箱转换。 如果是这种情况,使用??
不适合您,您必须使用第一个表达式。
这肯定是因为你在做odrDataReader["ID"] as int?
- 这是两个语句之间的区别,使用as
关键字与执行Convert
。
如果你想用??
你可以试试
Class.ID = Convert.ToInt32(odrDataReader["ID"] ?? 0);
误读了这个问题。 我猜是因为你将odrDataReader [“ID”]转换为int? 在检查之前。 你应该尝试跳过演员,但我怀疑这是什么问题。
合并运算符是C#2.0中添加的新运算符。 合并算子也称为??。
Nullable<int> a = null;
Nullable<int> b = 10;
int c = a ?? b.Value;
合并运算符Coalescing运算符与三元运算符类似,但它仅适用于Nullable类型。 所以它的sort hand操作符只能处理Nullable类型。
检查我的博客文章: 合并运算符 - ??
?? ?? operator是null-coalescing运算符 。 如果发现该值为null,则它定义默认值。 Int32是.NET中的一个值类型,它通常不能取空值,所以int?
指定可以为null的Int32。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.