我从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."
答案 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)
答案 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() ?? "";