web-dev-qa-db-ja.com

C#が暗黙的にintを文字列に変換できないのはなぜですか?

C#を使用すると、式で整数を文字列に暗黙的に変換できます。たとえば、これは完全に有効です。

_int myInt = 10;
string concatenatedString = "myInt is " + myInt;
string interpolatedString = $"myInt is {myInt}";
_

ただし、intが連結または補間されていない場合、C#では明示的な変換が必要です。

_int myInt = 10;
string myString = myInt; 
// compiler error "Cannot implicitly convert type 'int' to 'string'"
_

明らかに、これは大きな問題ではありません。単純な.ToString()がこれをうまく処理します。しかし、すべての可能なintも有効な文字列であることを.NETが知っているのに、なぜ明示的な変換が必要なのですか?コンパイラの「心」で何が起こっているのか知りたいのですが。

6
Jacob Stamm

どちらの場合でも、この言語は暗黙的なキャストを行うのではなく、構文シュガー機能を提供しています。

var s = "1" + 1;

コンパイル時に string Concat(object, object) メソッドに変換されます。

var s = String.Concat("1", 1);

そして2番目のケースでは、

var i = 1;
var s = $"1={i}";

コンパイル中にstring Format(string, object)(または同等の)メソッドに変換されます。

var s = string.Format("1={0}", i);

したがって、どちらの場合でも、intobjectにボックス化され、各メソッドはそのオブジェクトで.ToString()を呼び出します。暗黙的なキャストは必要ありません。

タイトルの質問:「なぜC#は暗黙的にintを文字列に変換できないのですか?」、その答えは、StringクラスもInt32構造体もimplicit operatorを実装していないため、暗黙的な変換ですこれらのタイプ間では不可能です。 C#7の投稿を読んで興味があるかもしれませんが、この言語で検討されている機能の1つが " Extension everything "と呼ばれています。これにより、さまざまな型と文字列の間の暗黙的な変換を言語に追加できるため、次のようなことが可能になります。

string s = 1;

あなたが本当にしたかったら。もちろん、それは問題を提起します、あなたはしたいですか?

14
David Arno

整数から文字列への「コンテキスト外」変換には、2つの一般的な使用例があります。

int myInt = 10;
string myString = myInt;

最初のシナリオでは、改行だけを含む1文字の文字列を作成します。

  • 10進数のふりをする10は文字です。
  • その文字だけを含む文字列を作成します。

2番目のシナリオでは、数字「1」と数字「0」を含む2文字の文字列を作成します。

  • 整数10の整数からASCIIへの変換を実行します。
  • 結果を新しい文字列に入れます。

C#がこれらの代替策のいずれかを実装している場合、他の代替策が機能すると想定して(誤って)多くのプログラマーが微妙なバグを書いた可能性があります。

0
Jasper