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

时间:2011-02-04 06:22:41

标签: c#

以下声明有效:

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);

6 个答案:

答案 0 :(得分:5)

在第一个中,您使用Convert.ToInt32(odrDataReader["ID"])在第二个odrDataReader["ID"] as int?中使用odrDataReader["ID"] as int?。 从你说的第一个是正确的,所以你也应该在第二个使用转换。

Actualy我认为首先是好的,因为如果你真的想使用它会看起来很奇怪?操作

修改: 要解释一点{{1}}不是转换。如果odrDataReader [" ID"]是字符串,它将始终返回null。

答案 1 :(得分:2)

这一切都取决于ID列的类型。如果它确实属于int?类型,那么您应该能够毫无问题地执行此操作:

Class.ID = (int?)odrDataReader["ID"] ?? 0;

然而,事实并非如此,并且是一种不同的类型(我猜string)。 string显然不是int?,因此odrDataReader["ID"] as int?始终返回null,您获得值0。正如Euphoric所提到的,as运算符仅进行引用/装箱转换。如果是这种情况,使用??不是您的选择,您必须使用第一个表达式。

答案 2 :(得分:1)

这肯定是因为你正在做odrDataReader["ID"] as int? - 这是两个语句之间的区别,使用as关键字与执行Convert不同。

如果您想使用??,可以尝试

Class.ID = Convert.ToInt32(odrDataReader["ID"] ?? 0);

答案 3 :(得分:0)

误读了这个问题。我猜是因为你将odrDataReader [“ID”]转换为int?在检查之前。你应该尝试跳过演员阵容,不过我怀疑这是什么问题。

答案 4 :(得分:0)

Coalescing运算符是在C#2.0中添加的新运算符。合并算子也称为??。

Nullable<int> a = null;
Nullable<int> b = 10;
int c = a ?? b.Value;

合并运算符 合并运算符的工作类似于三元运算符,但它仅适用于Nullable类型。所以它的sort hand操作符只能处理Nullable类型。

查看我的博文:Coalescing operator - ??

答案 5 :(得分:0)

??运算符是null-coalescing operator。如果发现该值为null,则它定义默认值。 Int32是.NET中的值类型,通常不能采用空值,因此int?指定一个可以为null的Int32。