11

これは失敗しますThere is no implicit conversion between 'null' and 'int'

long? myVar = Int64.Parse( myOtherVar) == 0 ? null : Int64.Parse( myOtherVar);

ただし、これは成功します。

if( Int64.Parse( myOtherVar) == 0)
    myVar = null;
else
    myVar = Int64.Parse( myOtherVar);

三項演算子を成功させる方法はありますか?

4

5 に答える 5

25

コンパイラは、右側の型を判断するときに左側を無視します。そのため、型を推測しようとすると

Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar)

左側が であるという事実に注意を払わずにそうしlong?ます。右辺の型を決定するために、次のことに注意してください。

Int64.Parse(myOtherVar)

は であり、暗黙的に に変換できるlongかどうかを確認しようとします。できないため、表示されるエラー メッセージが表示されます。nulllong

C# 仕様の §7.14 から:

b ? x : y....形式の条件式。

演算子の 2 番目と 3 番目のオペランドxy?:、条件式の型を制御します。

(1)xタイプがXあり、yタイプがあるY場合

を。から への暗黙的な変換 (§6.1) が存在し、 からへXが存在しYない場合、は条件式の型です。YXY

b. から への暗黙的な変換 (§6.1) が存在し、 からへYが存在しXない場合、は条件式の型です。XYX

c. そうしないと、式の型を判別できず、コンパイル エラーが発生します。

(2) と の 1 つだけが型xを持ち、とyの両方が暗黙的にその型に変換できる場合、それが条件式の型です。xy

(3) それ以外の場合、式の型を判別できず、コンパイル エラーが発生します。

状況 (2) にあることに注意してください。ここでは、 xisとnulltype がなく、yisInt64.Parse(myOtherVar)と has typeがありlongます。xは の型に暗黙的に変換できないことに注意してくださいy。したがって、上記の (1) と (2) の両方が失敗し、(3) という結果になり、質問に影響を与えたコンパイル時エラーが発生します。上記から、左辺は右辺の型を決定する役割を果たさないという暗黙の結論に注意してください。

この交換を修正するには

Int64.Parse(myOtherVar)

(long?)Int64.Parse(myOtherVar)

さて、その理由は

myVar = null;

コンパイラは からへの暗黙的な変換があることを認識しているため、 がmyVarそのまま宣言されている場所は問題ありません。long?nulllong?

最後に、に解析できないInt64.Parse場合はスローします。また、解析を 2 回実行していることに注意してください。これは不要です。より良いパターンはmyOtherVarlong

long value;
if(Int64.TryParse(myOtherVar, out value)) {
    myVar = value == 0 ? null : (long?)value;
}
else {
    // handle case where myOtherVar couldn't be parsed
}
于 2010-11-27T05:05:44.313 に答える
2

三項演算子の最後の部分のため、演算子の使用法は1Int64ではなくを返しています。nullable代わりに次のようにするとうまくいくかもしれません:

long? myVar = Int64.Parse( myOtherVar) == 0 ? null :
   (long?)Int64.Parse( myOtherVar);

long?代わりにa を返すように、nullをに変換する必要はありませんInt64

また、コード内で不必要に値を 2 回変換しています (1 回はテスト用、もう 1 回は値を取得するため)。あなたのコードはより良いかもしれません:

long? tempVar = Int64.Parse(myOtherVar);
long? myVar = tempVar==0? null : tempVar;
于 2010-11-27T05:05:42.060 に答える
2

私はあなたが言うつもりだったと確信しています:

  myVar = value == 0 ? null : (long?)value;

それ以外の

  myVar = value == 0 ? null : value;

「out」変数の使い方が気に入りました。ありがとう。

于 2010-11-27T08:51:49.017 に答える
0

コンパイラは式を左から右に評価しようとします。

long? myVar = Int64.Parse( myOtherVar) == 0 ? null : Int64.Parse( myOtherVar);

int64.parseメソッドはlong 値longではなく値を返します。との間にnullable変換はありませんので 、これを試してくださいnullInt64.Parse( myOtherVar);

long? myVar = Int64.Parse(myOtherVar) == 0 ? (long?) null : Int64.Parse(myOtherVar);

また
long? myVar = Int64.Parse(myOtherVar) == 0 ? null : (long?) Int64.Parse(myOtherVar);

于 2015-11-20T12:54:55.213 に答える
0

これはうまくいきます:

long? myVar = (long?)myOtherVar == 0 ? null : (long?)myOtherVar;

..短い答えが好きな人向け。

于 2015-10-07T20:30:41.687 に答える