使用 ??运算符和处理空值

时间:2011-07-15 17:15:18

标签: c# sql sqlcommand

我从SQL Server 2008数据库返回标量值:

string reason = cmd.ExecuteScalar().ToString() ?? : "";

我想确保如果返回null,则reason = ""而不是null。

我在这一行收到错误:

  

错误3无效的表达式术语':'

如何解决这个问题?

编辑:

感谢您对冒号的更改,现在我在同一行上收到此异常:

string reason = cmd.ExecuteScalar().ToString() ?? "";
System.NullReferenceException occurred
  Message="Object reference not set to an instance of an object."

7 个答案:

答案 0 :(得分:10)

试试这个:

string reason = cmd.ExecuteScalar().ToString() ?? "";

BUT:这仍然会失败,因为如果.ExecuteScalar()返回NULL,您就已经通过调用.ToString()来引发空引用异常空值......

所以我猜??运算符在这里没有帮助你......做“平常”的舞蹈:

object result = cmd.ExecuteScalar();

if(result != null)
{  
   reason = result.ToString();
}
else
{
   reason = "(NULL value returned)";
}

答案 1 :(得分:8)

首先,你不应该:使用时??操作

其次,要做到你想要做的事情而不会出现错误,你需要做的不同:

object objReason = cmd.ExecuteScalar();
string reason = objReason == null ? "" : objReason.ToString();

这将检查您的返回值是否为空,如果是,则第二行将原因设置为空字符串,否则它将使用您返回的值。

答案 2 :(得分:5)

由于ExecuteScalar()返回可能为object的{​​{1}},您不应该调用null,因为这可能会抛出异常。

.ToString()

这是有效的,因为string reason = Convert.ToString(cmd.ExecuteScalar()); 会将Convert.ToString()转换为null


或者如果你必须使用string.Empty因为你真的喜欢它:

??

答案 3 :(得分:2)

摆脱结肠。

string reason = cmd.ExecuteScalar().ToString() ?? "";

供参考,请查看MSDN page

答案 4 :(得分:2)

使用null-coalescing运算符时,不需要冒号:

string reason = cmd.ExecuteScalar().ToString() ?? "";

正如其他人指出的那样,ToString()会导致无论如何都会抛出NullReferenceExcpetion ......所以你在这里没有得到任何东西。将它分成多行你会好得多:

var result = cmd.ExecuteScalar();
string reason = result == null ? "" : result.ToString();

答案 5 :(得分:2)

你混淆了? conditional operator,其语法如下:

String x = condition ? valueIfConditionIsTrue : valueIfConditionIsFalse;

使用?? null-coalesce operator,其语法如下:

String x = possiblyNull ?? valueIfPossiblyNullIsNull;

所以,除了所有...... 这是你真正想要的部分

String reason = (cmd.ExecuteScalar() ?? "").ToString();

这会处理ToString()导致空引用异常的异常。

答案 6 :(得分:1)

只需使用

string reason = cmd.ExecuteScalar() ??  "";