質問

同僚が私にこれを聞いていたら、と私の脳混乱した状態に、私は答えを持っていなかった。

なぜそれはあなたが行うことができるということです。

string ham = "ham " + 4;

ではなく、

string ham = 4;

は、の連接のあるときに、暗黙的なキャスト/操作は、文字列変換のためにそこにいた場合は、なぜ同じ時にの文字列としてのそれを割り当てていませんか? (もちろん、いくつかの演算子のオーバーロードを実行せずに)

役に立ちましたか?

解決

コンパイラを連結すると、値"ham" + 4が箱詰めされ、その後、String.Concatがその上で呼び出されたので、2つのobjectパラメータをとる、4への呼び出しにステートメントToStringをオンにすると。

の割り当てについてintするstringからの暗黙の型変換はありませんので、あなたはそれを明示的に変換せず4stringを割り当てることはできません。

つまり2つの割り当ては、彼らがC#で非常に似ているという事実にもかかわらず、コンパイラによって非常に異なる方法で処理されます。

他のヒント

  

バイナリ+演算子はのために事前に定義されています   数値と文字列タイプ。数値の場合   タイプ、+はその両者の合計を計算します   オペランド。場合は、一方または両方のオペランド   文字列型である、+連結   の文字列表現   オペランドます。

参照する

  

代入演算子(=)を格納します   その右側のオペランドの値   保管場所、プロパティ、またはインデクサ   その左側のオペランドで示され、   その結果としての値を返します。ザ・   オペランドは同じ型でなければなりません(または   右側のオペランドでなければなりません   のタイプに暗黙的に変換   左側のオペランド)。

参照する

連結を行う際に、

暗黙の変換はありません。文字列の連結は、オブジェクトを受け取るオーバーロードがありString.Concat呼び出し、まで解決されます。これは、文字列に(明示的に)変換を行う。このオーバーロードされます。

第二式の右辺の値はないが、

最初の式の右辺の値は、ストリングです。 concatonationは割り当てが特別な何もしてない場合、最初のシナリオで魔法を提供しています。 2つ目のシナリオでは、割り当ては、ダム再生し続けます。

表現

"ham " + 4 

は、文字列型と加算演算子の組み合わせに基づいて、文字列に4の暗黙的な変換を強制します。具体的には、「+」演算子の品質だ、と演算子オーバーロードを行うときは、手動のものと同じタイプを実装することができます。

同様の少ない明白な例は次のようになります。

長いmyNumber = Int64.MaxValue - 1

この場合には「1」は、32ビット整数として評価されるべきであるが、それは暗黙的に変換されます。あなたは、コンパイラでサポートされている暗黙的な変換の完全なリストのためのC#言語仕様のセクション6.1を確認することができます。

編集:明確にするために、「+」などの事業者が独自のサポートされている変換を有することができる。

私は、リストにコンパイラでサポートされている暗黙の型変換を参照し、言語仕様のセクション。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top