В своем ответе на на этот вопрос BlackBear предложил заменить
string y = Session["key"] == null ? "none" : Session["key"].ToString();
с
string y = (Session["key"] ?? "none").ToString();
Это прекрасно работает, если Session["key"]
является строковым значением, но что, если я хочу сделать это с объектом? Например, я мог бы сделать это:
string y = GetMyObject() == null ? "none" : GetMyObject().ToString();
Но что, если я не хочу оценивать GetMyObject()
дважды? Является ли мой единственный выбор для сохранения результатов в переменной, а затем проверить эту переменную на нулевое значение?
var x = GetMyObject();
string y = (x == null) ? "none" : x.ToString();
Редактировать: Это все теоретически - я сталкивался с этим раньше, но у меня нет конкретного примера передо мной прямо сейчас. При этом, вот пример класса.
class MyObject
{
private MyObject() { }
public MyObject GetMyObject() { return new MyObject(); }
public override string ToString() { return "A String"; }
}
Если я сделаю string y = (GetMyObject() ?? "none").ToString();
, я получу
Оператор '??' не может быть применен к операндам типа 'MyObject' и 'string' ".
В идеале я бы смог сделать
string y = GetMyObject().ToString() ?? "none";
и он будет работать, даже если GetMyObject () имеет значение null. В основном нуль-сливающийся оператор, действующий как автономный try {} catch (NullReferenceException) {}
. Я знаю, что не могу , но это было бы идеально.