2017-06-14 4 views
0

Null伝播演算子(??)を使用してこれを実装できますか?null伝播 - ヌルチェック時に関数を実行

origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null; 
+1

あなたがそうでなければ、あなたがする必要があります、GetObj'は 'null'なので入力をどうするかを決める'ようにする必要があります。GetObj方法はこのようであれば、プログラムがクラッシュすることがありますあなたがそれを呼び出すときにどこでもチェックをしてください。 – JohanP

答えて

3

いいえ、あなたが欲しいものとは反対の方向に働いているため、ここでは伝播しません。

最初の部分がnullであるかどうかをチェックし、その場合にのみ2番目の部分を実行します。私はあなたがそれを逆転させる方法を想像することはできません。

しかし@JohanPが、それはあなたの関数にチェック移動するはるかに優れていると述べたように:

public object GetObj(object input) 
{ 
    if (input == null) return null; 
    .... 
} 

origObj = GetObj(model.ProjectId); 
0

これはヌル伝播演算子(??)を使用して実装することができますか?

var origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null; 

まずオペレータ??のはヌル合体演算子です。それを使いたいのであれば、??の左辺がヌルならば、単に右辺を左辺とすればいいということです。あなたはこれを書くことだったのであれば、あなたの場合には、それは動作しません理由:

var origObj = model.ProjectId ?? GetObj(model.ProjectId.Value); 

それは意味します:model.ProjectIdがnullでない場合、origObjに割り当てます。それ以外の場合は、GetObj(model.ProjectId.Value)の戻り値を割り当て、model.ProjectIdがnullであるためにクラッシュします。

このように動作します?Nullの伝播オペレータ:?の左側がnullでない場合は、それに何かを呼び出します。たとえば、次のようになります。

public class Foo 
{ 
    public void Bar() {} 
} 

var foo = new Foo(); 
foo?.Bar(); 

状況によっては、3者演算子が問題なく動作します。しかし、それはすべてGetObjメソッドの戻り値の型に依存します。メソッドがvoidを返す場合、それはコンパイルされません。メソッドがプリミティブ型を返す場合は、三項演算子の両方の枝が同じ型を返さなければならないので、このようにキャストする必要があります。 GetObjboolを返している場合たとえば、あなたはこの必要があります:

var origObj = model.ProjectId != null 
    ? GetObj(model.ProjectId.Value) : 
    (bool?)null; 

をガッチャ

あなたはGetObjメソッドにnullをチェックを残す場合は最後に、あなたはトラブルに終わると、あなたも

public object GetObj(object value) 
{ 
    if (value == null) 
    { 
     throw new InvalidOperationException("Cannot call with null"); 
    } 
}