暗黙のキャストが失敗する理由について興味があります...
int? someValue = SomeCondition ? ResultOfSomeCalc() : null;
代わりに明示的なキャストを実行する必要がある理由
int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null;
コンパイラーには、暗黙のキャスト決定を行うために必要なすべての情報があるように思えますね。
暗黙のキャストが失敗する理由について興味があります...
int? someValue = SomeCondition ? ResultOfSomeCalc() : null;
代わりに明示的なキャストを実行する必要がある理由
int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null;
コンパイラーには、暗黙のキャスト決定を行うために必要なすべての情報があるように思えますね。
C#3.0仕様の関連セクションは、条件演算子である7.13です。
?:演算子の2番目と3番目のオペランドは、条件式のタイプを制御します。XとYを2番目と3番目のオペランドのタイプとします。それで、
XとYが同じタイプの場合、これは条件付きのタイプです。それ以外の場合、暗黙の変換(§6.1)がXからYに存在するが、YからXには存在しない場合、Yは条件式のタイプです。それ以外の場合、YからXへの暗黙の変換(§6.1)が存在するが、XからYへの変換は存在しない場合、Xは条件式のタイプです。そうしないと、式の種類を判別できず、コンパイル時エラーが発生します。
また、特に値型の場合、割り当てに基づいて型を推測できないことにも悩まされています。ただし、オブジェクト階層に入ると、理由があります。
「ResultOfSomeCalc()」が「int?」を返した場合、これは機能します。C# は、割り当ての左側にあるものに関係なく、型を把握する必要があります。したがって、null または int を返すことを伝えています。また、共通の分母として Nullable を代用するコンパイラのロジックは存在しません。
これらのバリアントは機能することに注意してください。次のことを理解するのに役立つ場合があります。
object someValue = true ? new Nullable<int>(ResultOfSomeCalc()) : null;
object someValue = true ? (int?)ResultOfSomeCalc() : null;
お役に立てれば。
このコードが C# で無効なのはなぜですか?も参照してください。
関数 ResultOfSomeCalc() の戻り値の型を (int?) int のように nullabel int にし
ますか? someValue =(int?) SomeCondition ? ResultofSomeCalc() : (int?)null;
関数 ResultofSomeCalc() が int を返す場合は? その後、これは機能します。
関数が int を返す場合、コンパイラは次の警告を発行します。'int' と '' の間に暗黙的な変換がないため、条件式の型を特定できません
。条件演算子 "?:" の両方の式は、同じ型であるか、暗黙のキャストによって同じ型に変換できる必要があります。
ResultOfSomeCalc の戻り値の型を int? に変更しないと、null 式にキャストする必要があります。