2017-01-10 4 views
0

?:演算子を使用するメソッドからnull可能な型を返すのが難しいです。例えば3進演算子を使用するメソッドからnullable値を返す

は、この作品:

public static Int32? RunInt32Query(string query, KeyValueCollection parameters) 
    { 
     object scalar = RunScalarQuery(query, parameters); 

     if (scalar != null) 
     { 
      return Convert.ToInt32(scalar); 
     } 
     else 
     { 
      return null; 
     } 
    } 

しかし、この例では動作しません、それはコンパイルされません。

public static Int32? RunInt32Query(string query, KeyValueCollection parameters) 
    { 
     object scalar = RunScalarQuery(query, parameters); 

     return (scalar != null) ? Convert.ToInt32(scalar) : null; 
    } 

を、私はそれを理解できるように、両方の方法はでほぼ同じことをやっています高レベルですが、明らかにそうではありませんか?

+2

あなたは 'does not work 'によって何を意味しましたか –

+0

@ un-lucky 2番目の例ではコンパイルされません。 –

答えて

6

この試し:コンパイラは、ターゲット・タイプがInt32?であることを知っている(メソッド宣言に基づいて)、従って、自動的に結果を変換することができ

return Convert.ToInt32(scalar); 

return (scalar != null) ? (Int32?)Convert.ToInt32(scalar) : null; 

を暗黙の変換に基づいて式Convert.ToInt32(scalar)を返します。

条件付き演算子では、コンパイラは最初に式(scalar != null) ? Convert.ToInt32(scalar) : nullの型を判別しようとします。この目的のために、2つの結果式のタイプ、すなわちConvert.ToInt32(scalar)nullを評価します。これらのタイプはそれぞれInt32Objectです。どちらの式もInt32?に変換できることは、コンパイラには分かりません。

+0

賢い、ありがとう! –

関連する問題