5

我正在尝试在 int 上使用 null 合并运算符。当我在字符串上使用它时它可以工作

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 数据类型。谁能告诉我做错了什么?

4

6 回答 6

10

我怀疑你真正想做的是将 BoardID 设置为 0 如果 dr["BoardID"] 从数据库中为 NULL。因为如果 dr["BoardID"] 为 null,则 Convert.ToInt32 将失败。尝试这个:

UserProfile.BoardID = (dr["BoardID"] is DbNull) ? 0 : Convert.ToInt32(dr["BoardID"]);
于 2011-07-08T16:29:32.783 回答
7

An intis never null,所以应用??它没有意义。

实现您想要的一种方法是TryParse

int i;
if(!int.TryParse(s, out i))
{
    i = 0;
}

或者既然你想得到0或者default(int)你可以扔掉if,因为TryParse错误情况下的输出参数已经是default(int)

int i;
int.TryParse(s, out i);

您链接的文章在butint的左侧没有。这是 的快捷方式,因此支持它是有意义的。??int?Nullable<int>null??

int? count = null;    
int amount = count ?? default(int); //count is `int?` here and can be null
于 2011-07-08T16:26:20.907 回答
5

是的,当然......因为int不能为空。
它只有 32 位,所有的组合都代表一个有效的整数。

int?如果您想要可空性,请改用。(它是 . 的简写System.Nullable<int>。)

于 2011-07-08T16:26:36.627 回答
1

在您的链接??运算符应用于Nullable<int>( int?) 可以具有空值。

Null-coalescing 运算符的工作方式如下:

如果运算符左侧的值为空,则返回运算符右侧的值。Int 是值类型,所以它永远不能有空值。这就是你得到错误的原因。

于 2011-07-08T16:28:49.740 回答
0

在示例中,您将带有??运算符的行链接int为:

int? count = null;

int amount = count ?? default(int);

因此在该示例中 int 可以为空

于 2011-07-08T16:28:12.693 回答
-1

您只能对引用类型或可为空的值类型使用 null 合并运算符。例如:string,或int?参见http://msdn.microsoft.com/en-us/library/ms173224.aspx

于 2011-07-08T16:27:46.797 回答