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

l--*_*''' 3 c# sql sqlcommand

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

string reason = cmd.ExecuteScalar().ToString() ?? : "";
Run Code Online (Sandbox Code Playgroud)

我想确保if null返回,那reason = ""并且不是null.

我在这一行上收到错误:

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

怎么解决这个问题?

编辑:

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

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

mar*_*c_s 10

试试这个:

string reason = cmd.ExecuteScalar().ToString() ?? "";
Run Code Online (Sandbox Code Playgroud)

但是:这仍然会失败,因为如果.ExecuteScalar()返回a NULL,你已经通过调用.ToString()那个NULL值引起了Null Reference Exception ......

所以我想这里的??运营商真的没有帮助你......做"平时"的舞蹈:

object result = cmd.ExecuteScalar();

if(result != null)
{  
   reason = result.ToString();
}
else
{
   reason = "(NULL value returned)";
}
Run Code Online (Sandbox Code Playgroud)

  • `string reason =(cmd.ExecuteScalar()?? String.Empty).ToString();`work?无论如何,+1才能得到唯一正确答案......(或者至少在1分钟前......) (2认同)

Cha*_*ung 8

首先,你不应该:使用时?? 运营商.

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

object objReason = cmd.ExecuteScalar();
string reason = objReason == null ? "" : objReason.ToString();
Run Code Online (Sandbox Code Playgroud)

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


hun*_*ter 5

因为可能是你不应该调用的ExecuteScalar()返回object,因为那可能会抛出异常.null.ToString()

string reason = Convert.ToString(cmd.ExecuteScalar());
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为Convert.ToString()将转换nullstring.Empty


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

(cmd.ExecuteScalar() ?? (object)"").ToString();
Run Code Online (Sandbox Code Playgroud)