コンパイラは、右側の型を判断するときに左側を無視します。そのため、型を推測しようとすると
Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar)
左側が であるという事実に注意を払わずにそうしlong?
ます。右辺の型を決定するために、次のことに注意してください。
Int64.Parse(myOtherVar)
は であり、暗黙的に に変換できるlong
かどうかを確認しようとします。できないため、表示されるエラー メッセージが表示されます。null
long
C# 仕様の §7.14 から:
b ? x : y
....形式の条件式。
演算子の 2 番目と 3 番目のオペランドx
とy
は?:
、条件式の型を制御します。
(1)x
タイプがX
あり、y
タイプがあるY
場合
を。から への暗黙的な変換 (§6.1) が存在し、 からへX
が存在しY
ない場合、は条件式の型です。Y
X
Y
b. から への暗黙的な変換 (§6.1) が存在し、 からへY
が存在しX
ない場合、は条件式の型です。X
Y
X
c. そうしないと、式の型を判別できず、コンパイル エラーが発生します。
(2) と の 1 つだけが型x
を持ち、とy
の両方が暗黙的にその型に変換できる場合、それが条件式の型です。x
y
(3) それ以外の場合、式の型を判別できず、コンパイル エラーが発生します。
状況 (2) にあることに注意してください。ここでは、 x
isとnull
type がなく、y
isInt64.Parse(myOtherVar)
と has typeがありlong
ます。x
は の型に暗黙的に変換できないことに注意してくださいy
。したがって、上記の (1) と (2) の両方が失敗し、(3) という結果になり、質問に影響を与えたコンパイル時エラーが発生します。上記から、左辺は右辺の型を決定する役割を果たさないという暗黙の結論に注意してください。
この交換を修正するには
Int64.Parse(myOtherVar)
と
(long?)Int64.Parse(myOtherVar)
さて、その理由は
myVar = null;
コンパイラは からへの暗黙的な変換があることを認識しているため、 がmyVar
そのまま宣言されている場所は問題ありません。long?
null
long?
最後に、に解析できないInt64.Parse
場合はスローします。また、解析を 2 回実行していることに注意してください。これは不要です。より良いパターンはmyOtherVar
long
long value;
if(Int64.TryParse(myOtherVar, out value)) {
myVar = value == 0 ? null : (long?)value;
}
else {
// handle case where myOtherVar couldn't be parsed
}