使用??操作符和处理空值

本文关键字:空值 处理 操作符 使用 | 更新日期: 2023-09-27 18:02:32

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

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

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

我在这行得到一个错误:

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

如何解决这个问题?

编辑:

谢谢你对冒号的修改,现在我在同一行看到了这个异常:

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

使用??操作符和处理空值

试试这个:

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

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

所以我猜??运算符在这里真的没有帮助你…像往常一样跳舞:

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

首先,在使用??运营商。

第二,要想在这里做你想做的事情而不得到错误,你需要用不同的方法:

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

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

由于ExecuteScalar()返回的object可能是null,因此不应该调用.ToString(),因为这可能引发异常。

string reason = Convert.ToString(cmd.ExecuteScalar());

Convert.ToString()会将null转换为string.Empty


或者如果你必须使用??,因为你真的很喜欢它:

(cmd.ExecuteScalar() ?? (object)"").ToString();

去掉冒号。

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

请参考MSDN页面

当使用空合并运算符时,不需要冒号:

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

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

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

你搞混了?条件操作符,其语法如下所示:

String x = condition ? valueIfConditionIsTrue : valueIfConditionIsFalse;

与??空合并操作符,其语法如下:

String x = possiblyNull ?? valueIfPossiblyNullIsNull;

所以,除了这些…这是你真正想要的部分:

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

这将处理ToString()导致null引用异常的异常。

就用

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