使用??操作符和处理空值
本文关键字:空值 处理 操作符 使用 | 更新日期: 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() ?? "";