我正在尝试在int上使用null-coalescing运算符。当我在字符串上使用它时它可以工作
UserProfile.Name = dr["Name"].ToString()??"";
当我尝试在像这样的int上使用它时
UserProfile.BoardID = Convert.ToInt32(dr["BoardID"])??default(int);
我收到此错误消息
运营商'??'无法应用 'int'和'int'类型的操作数
我发现这篇博客文章中使用了http://davidhayden.com/blog/dave/archive/2006/07/05/NullCoalescingOperator.aspx和int数据类型。谁能说出我做错了什么?
答案 0 :(得分:7)
如果dr [“BoardID”]从数据库中为NULL,我怀疑你真正要做的是将BoardID设置为0。因为如果dr [“BoardID”]为空,则Convert.ToInt32将失败。试试这个:
UserProfile.BoardID = (dr["BoardID"] is DbNull) ? 0 : Convert.ToInt32(dr["BoardID"]);
答案 1 :(得分:5)
是的,当然......因为int
不能为空
它只有32位,所有组合都代表一个有效的整数。
如果您想要可空性,请使用int?
。 (这是System.Nullable<int>
的简写。)
答案 2 :(得分:4)
int
永远不会null
,因此将??
应用到它是没有意义的。
实现目标的一种方法是TryParse
:
int i;
if(!int.TryParse(s, out i))
{
i = 0;
}
或者,由于您希望获得0
或default(int)
,因此您可以删除if,因为错误情况下TryParse
的输出参数已经default(int)
:< / p>
int i;
int.TryParse(s, out i);
您链接的文章在int
左侧??
但int?
没有Nullable<int>
。这是null
的快捷方式,支持??
,因此int? count = null;
int amount = count ?? default(int); //count is `int?` here and can be null
对此有用。
{{1}}
答案 3 :(得分:1)
在您的链接中??
运算符应用于Nullable<int>
(int?
),该值可以为空值。
Null-coalescing运算符按以下方式工作:
如果运算符左侧的值为null,则返回运算符右侧的值。 Int是值类型,因此它永远不会具有空值。这就是你得到错误的原因。
答案 4 :(得分:0)
在示例中,您将行与??
上的int
运算符相关联:
int? count = null;
int amount = count ?? default(int);
因此,在该示例中,int是可空的
答案 5 :(得分:-1)
您只能对引用类型或可空值类型使用null-coalescing运算符。例如:string
或int?
请参阅http://msdn.microsoft.com/en-us/library/ms173224.aspx