9

同僚が私にこれを尋ねた場合、私の頭が混乱した状態で、答えがありませんでした:

あなたができるのはなぜですか:

string ham = "ham " + 4;

だがしかし:

string ham = 4;

を連結するときに文字列変換の暗黙のキャスト/操作がある場合、それを文字列として割り当てるときに同じではないのはなぜですか? (もちろん、演算子のオーバーロードを行わずに)

4

5 に答える 5

20

コンパイラーを連結すると、ステートメント"ham" + 4がへの呼び出しに変わりますString.Concat。これは2つのobjectパラメーターを受け取るため、値4はボックス化ToStringされてから呼び出されます。

int割り当ての場合、からへの暗黙の変換はないため、明示的に変換せずにstringに割り当てることはできません。4string

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

于 2009-02-05T20:17:14.160 に答える
4

二項 + 演算子は、数値型および文字列型に対して事前定義されています。数値型の場合、+ は 2 つのオペランドの合計を計算します。一方または両方のオペランドが文字列型の場合、+ はオペランドの文字列表現を連結します。

参照

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

参照

于 2009-02-05T20:25:22.413 に答える
2

連結を行う場合、暗黙の変換はありません。文字列の連結は、Objectsを受け取るオーバーロードを持つString.Concat呼び出しに解決されます。文字列への(明示的な)変換を実行するのはこのオーバーロードです。

于 2009-02-05T20:17:29.917 に答える
0

最初の式の右辺の値は文字列ですが、2番目の式の右辺の値は文字列ではありません。連結は、割り当てが特別なことを何もしていない最初のシナリオで魔法を提供します。2番目のシナリオでは、割り当ては引き続きダムを再生します。

于 2009-02-05T20:16:22.557 に答える
0

表現

"ham " + 4 

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

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

long myNumber = Int64.MaxValue-1;

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

編集:明確にするために、私が参照した言語仕様のセクションには、コンパイラーによってサポートされる暗黙の変換がリストされていますが、「+」などの演算子は、独自のサポートされる変換を持つことができます。

于 2009-02-05T20:20:53.950 に答える