以下声明有效:
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);
答案 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。