с использованием ?? оператор и имеет дело с нулевым значением - PullRequest
3 голосов
/ 15 июля 2011

Я возвращаю скалярное значение из базы данных SQL Server 2008:

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

Я хочу убедиться, что если возвращается null, то reason = "", а не нуль.

Я получаю сообщение об ошибке:

Ошибка 3 Неправильный термин выражения ':'

Как это можно исправить?

EDIT:

спасибо вам за изменения в двоеточии, теперь я получаю это исключение в той же строке:

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

Ответы [ 7 ]

10 голосов
/ 15 июля 2011

Попробуйте это:

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

НО: это все равно не удастся, поскольку, если .ExecuteScalar() возвращает NULL, вы уже вызываете исключение нулевой ссылки, вызывая .ToString() для этого значения NULL ..... .

Так что, я думаю, оператор ?? здесь действительно не поможет ... выполните "обычный" танец:

object result = cmd.ExecuteScalar();

if(result != null)
{  
   reason = result.ToString();
}
else
{
   reason = "(NULL value returned)";
}
8 голосов
/ 15 июля 2011

Во-первых, вы не должны иметь: при использовании ?? оператор.

Во-вторых, чтобы сделать то, что вы пытаетесь сделать здесь без ошибки, вам нужно сделать это по-другому:

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

Это проверит, является ли ваше возвращаемое значение нулевым, и если это так, во второй строке будет указана причина для пустой строки, в противном случае будет использоваться ваше возвращенное значение.

5 голосов
/ 15 июля 2011

Так как ExecuteScalar() возвращает object, что может быть null, вы не должны вызывать .ToString(), поскольку это может вызвать исключение.

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

Это работает, потому что Convert.ToString() будетконвертируйте null в string.Empty


или, если вам нужно использовать ??, потому что вам действительно нравится:

(cmd.ExecuteScalar() ?? (object)"").ToString();
2 голосов
/ 15 июля 2011

Вы путаете ? условный оператор , синтаксис которого выглядит так:

String x = condition ? valueIfConditionIsTrue : valueIfConditionIsFalse;

с ?? оператор нуль-слияния , синтаксис которого следующий:

String x = possiblyNull ?? valueIfPossiblyNullIsNull;

Итак, кроме всего этого ... это та часть, которую вы действительно хотите :

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

Это касается вашего исключения, когда ToString() вызывало исключение с нулевой ссылкой.

2 голосов
/ 15 июля 2011

При использовании оператора объединения нулей вам не нужно двоеточие:

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

Как уже указывали другие, ToString () в любом случае вызовет NullReferenceExcpetion ...Вы ничего не получаете здесь.Вам было бы гораздо лучше разбить это на несколько строк:

var result = cmd.ExecuteScalar();
string reason = result == null ? "" : result.ToString();
2 голосов
/ 15 июля 2011

Просто избавьтесь от двоеточия.

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

Для справки проверьте страницу MSDN .

1 голос
/ 15 июля 2011

Просто используйте

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