次のコードはコンパイルされません。
string foo = "bar";
Object o = foo == null ? DBNull.Value : foo;
エラー1「System.DBNull」と「string」の間に暗黙の変換がないため、条件式のタイプを判別できません。
これを修正するには、次のようなことを行う必要があります。
string foo = "bar";
Object o = foo == null ? DBNull.Value : (Object)foo;
これは確かに合法であるため、このキャストは無意味に思えます。
string foo = "bar";
Object o = foo == null ? "gork" : foo;
三項分岐のタイプが異なる場合、コンパイラは値をタイプオブジェクトに自動ボックス化しないようですが、同じタイプの場合、自動ボックス化は自動的に行われます。
私の考えでは、最初のステートメントは合法である必要があります...
コンパイラがこれを許可しない理由と、C#の設計者がこれを選択した理由を誰かが説明できますか?これはJavaでは合法だと思います...これは確認していませんが。
ありがとう。
編集: JavaとC#がこれを異なる方法で処理する理由、これを無効にするC#のシーンの下で何が起こっているのかを理解してください。私は三元の使い方を知っていて、例をコーディングするための「より良い方法」を探していません。C#の3値のルールは理解していますが、なぜ...
編集(Jon Skeet):この質問にはボクシングが含まれていないため、「autoboxing」タグを削除しました。