将c#Null-Coalescing运算符与int一起使用

时间:2011-07-08 16:24:57

标签: c# null-coalescing-operator

我正在尝试在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数据类型。谁能说出我做错了什么?

6 个答案:

答案 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;
}

或者,由于您希望获得0default(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运算符。例如:stringint?请参阅http://msdn.microsoft.com/en-us/library/ms173224.aspx