暗黙的および明示的な文字列とint型、
質問
同僚が私にこれを聞いていたら、と私の脳混乱した状態に、私は答えを持っていなかった。
なぜそれはあなたが行うことができるということです。
string ham = "ham " + 4;
ではなく、
string ham = 4;
は、の連接のあるときに、暗黙的なキャスト/操作は、文字列変換のためにそこにいた場合は、なぜ同じ時にの文字列としてのそれを割り当てていませんか? (もちろん、いくつかの演算子のオーバーロードを実行せずに)
解決
コンパイラを連結すると、値"ham" + 4
が箱詰めされ、その後、String.Concat
がその上で呼び出されたので、2つのobject
パラメータをとる、4
への呼び出しにステートメントToString
をオンにすると。
の割り当てについてint
するstring
からの暗黙の型変換はありませんので、あなたはそれを明示的に変換せず4
にstring
を割り当てることはできません。
つまり2つの割り当ては、彼らがC#で非常に似ているという事実にもかかわらず、コンパイラによって非常に異なる方法で処理されます。
他のヒント
暗黙の変換はありません。文字列の連結は、オブジェクトを受け取るオーバーロードがありString.Concat呼び出し、まで解決されます。これは、文字列に(明示的に)変換を行う。このオーバーロードされます。
最初の式の右辺の値は、ストリングです。 concatonationは割り当てが特別な何もしてない場合、最初のシナリオで魔法を提供しています。 2つ目のシナリオでは、割り当ては、ダム再生し続けます。
表現
"ham " + 4
は、文字列型と加算演算子の組み合わせに基づいて、文字列に4の暗黙的な変換を強制します。具体的には、「+」演算子の品質だ、と演算子オーバーロードを行うときは、手動のものと同じタイプを実装することができます。
同様の少ない明白な例は次のようになります。
長いmyNumber = Int64.MaxValue - 1
この場合には「1」は、32ビット整数として評価されるべきであるが、それは暗黙的に変換されます。あなたは、コンパイラでサポートされている暗黙的な変換の完全なリストのためのC#言語仕様のセクション6.1を確認することができます。
編集:明確にするために、「+」などの事業者が独自のサポートされている変換を有することができる。
私は、リストにコンパイラでサポートされている暗黙の型変換を参照し、言語仕様のセクション。