繁体   English   中英

? 操作员VS ?? 运营商用法

[英]? 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所提到的asas运算符只能进行引用/装箱转换。 如果是这种情况,使用?? 不适合您,您必须使用第一个表达式。

这肯定是因为你在做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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM