この質問に対する彼の回答で、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()
しかし、 2 回評価したくない場合はどうすればよいでしょうか。結果を変数に格納し、その変数で null をチェックする唯一の選択肢はありますか?
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 の場合でも動作するようにします。基本的に、自己完結型として機能する null 合体演算子try {} catch (NullReferenceException) {}
。できないことはわかっていますが、それが理想です。