259

奇妙なエラーに遭遇しました:

private bool GetBoolValue()
{
    //Do some logic and return true or false
}

次に、別の方法で、次のようにします。

int? x = GetBoolValue() ? 10 : null;

簡単に言えば、メソッドが true を返す場合、Nullable intx に 10 を割り当てます。それ以外の場合は、null許容intに null を代入します。ただし、コンパイラは不平を言います:

intエラー 1 と の間に暗黙的な変換がないため、条件式の型を特定できません<null>

私は気が狂いますか?

4

9 に答える 9

431

コンパイラは最初に右側の式を評価しようとします。

GetBoolValue() ? 10 : null

はリテラル ( ではない10)であり、まあ、です。これら2つの間に暗黙的な変換がないため、エラーメッセージが表示されます。intint?nullnull

右側の式を次のいずれかに変更すると、int?and null(#1) とintand int?(#2, #3) の間に暗黙的な変換があるため、コンパイルされます。

GetBoolValue() ? (int?)10 : null    // #1
GetBoolValue() ? 10 : (int?)null    // #2
GetBoolValue() ? 10 : default(int?) // #3
于 2009-05-13T14:03:29.910 に答える
36

これを試して:

int? x = GetBoolValue() ? 10 : (int?)null;

基本的に何が起こっているかというと、条件演算子が式の「戻り値の型」を判断できないということです。コンパイラはそれ10が anintであると暗黙的に判断するため、この式の戻り値の型intも同様に an であると判断します。(条件演算子の第 3 オペランド) はありint得ないため、文句を言います。null

nullを aにキャストするNullable<int>ことで、この式の戻り値の型が a であることをコンパイラに明示的に伝えますNullable<int>10toを同様に簡単にキャストすることもできint?、同じ効果が得られました。

于 2009-05-13T13:54:58.193 に答える
15

これを試して:

int? result = condition ? 10 : default(int?);

于 2012-04-02T08:07:52.903 に答える
15

ちなみに、Microsoft の C# コンパイラの実装では、(私にとって) 非常に巧妙で興味深い方法で、条件演算子の型分析が間違っています。それに関する私の記事は、型推論の問題、パート 1 (2006-05-24) です。

于 2009-05-13T15:09:39.007 に答える
5

次のいずれかを試してください。

int? x = GetBoolValue() ? (int?)10 : null;

int? x = GetBoolValue() ? 10 : (int?)null;
于 2009-05-13T13:59:28.217 に答える
5

問題は、三項演算子が最初のパラメーター割り当てに基づいて型を推測していることです...この場合は 10 です。これは int であり、nullable int ではありません。

あなたはより良い運を持っているかもしれません:

int? x = GetBoolValue() (int?)10 : null;
于 2009-05-13T14:00:53.067 に答える
4
int? x = GetBoolValue() ? 10 : (int?)null;

これが表示される理由は、バックグラウンドで Nullable を使用しており、「null」が Nullable の null インスタンスであることを C# に伝える必要があるためです。

于 2009-05-13T13:57:23.213 に答える
4

明示的なキャストを追加するだけです。

int? x = GetBoolValue() ? 10 : (int?)null;

混乱するのは三項演算子です。2 番目の引数は整数であり、3 番目の引数も整数であると予想され、null は適合しません。

于 2009-05-13T14:00:03.847 に答える
4

これは、コンパイラが、結果の割り当て先ではなく、2 番目と 3 番目のオペランドによって条件演算子の型を決定するためです。コンパイラが型を決定するために使用できる整数と null 参照の間の直接キャストはありません。

于 2009-05-13T14:09:56.017 に答える