1. ホーム
  2. c#

[解決済み】'int'と<null>の間に暗黙の変換がないため、条件式の型が決定できない

2022-04-08 17:39:07

質問

なぜコンパイルできないのですか?

int? number = true ? 5 : null;

int' と <null> 間の暗黙の変換がないため、条件式の型が決定できません。

どのように解決するのですか?

仕様書(§7.14)では、条件式に対して b ? x : y のどちらか、3つの可能性があります。 xy はどちらもタイプ ある 良い条件 を満たした場合、どちらか一方のみ xy は、タイプ ある 良い条件 を満たすか、コンパイル時エラーが発生します。ここで、quot;特定の良い条件"とは、特定の変換が可能であることを意味し、その詳細については後ほど説明します。

では、仕様書の肝心な部分に目を向けてみましょう。

<ブロッククオート

のどちらか一方だけなら xy は型を持ち、両方とも xy がその型に暗黙のうちに変換される場合、その型が条件式の型となる。

ここで問題となるのは

int? number = true ? 5 : null;

は、条件付き結果のうち1つだけが型を持っています。ここで xint というリテラルと ynull を行うものです。 ではない 型がある null に暗黙のうちに変換されることはありません。 int 1 . したがって、"ある良い条件"を満たしておらず、コンパイル時エラーが発生します。

そこで これを回避する方法が2つあります。

int? number = true ? (int?)5 : null;

ここでは、まだ xy は型を持つ。なお null 今も が型を持っていない場合でも、コンパイラは何の問題も発生させません。 (int?)5null はどちらも暗黙のうちに int? (§6.1.4と§6.1.5)。

もう一方は当然です。

int? number = true ? 5 : (int?)null;

を読み込まなければならないが、今度は 異なる という節があり、なぜこれがOKなのかを理解することができます。

もし x は、タイプ Xy は、タイプ Y では

  • から暗黙の変換(6.1節)が存在する場合、その変換は X から Y からではなく Y から X であれば Y は条件式の型である。

  • から暗黙の変換(§6.1)が存在する場合、その変換は Y から X からではなく X から Y であれば X は条件式の型である。

  • それ以外の場合は、式の型が決定できず、コンパイル時エラーが発生します。

これ x は、タイプ inty は、タイプ int? . から暗黙のうちに変換されることはありません。 int? から int からの暗黙の変換があります。 int から int? ということで、式の型は int? .

1 : さらに、条件式の型を決定する際に、左辺の型は無視されることに注意してください。これは、ここでよくある混乱の原因です。