4

私たちはできる:

var t=new String(new[] { '繁', '體', '中', '文' });

また

var encoding=Encoding.Unicode;
var bytes=encoding.GetBytes(new[] { 'E', 'n', 'g', 'l', 'i', 's', 'h' });
var t=encoding.GetString(bytes);

次のような何かをせずに:

public static implicit operator String(char[] charArray) {
    return new String(charArray);
}

できない:

String t=new[] { 'р', 'у', 'с', 'с', 'к', 'и', 'й', '\x20', 'я', 'з', 'ы', 'к' };

文字配列は文字列と同じではないことを私は知っています; しかし、文字配列を文字列に直接割り当てたい場合もあります。明示的なキャスト、変換、またはnew X(new Y(new Z ...

そして、個人的には、それが提供されない理由はおそらく次の理由によると思います
。C-Sharpチームは、特にC ++ / Cの経験があるプログラマーに、C-SharpはC++やCほど類似していないことを覚えておいてほしいと思っています。

問題は、なぜそうではないのかということです。それは悪いですか?

4

6 に答える 6

4

暗黙的な変換はコンパイラー機能です。CLI仕様には、それらを許可するものは何もありません。ILでのすべての変換は明示的です。intからlong、floatからdoubleのような単純なものでさえ。したがって、その構文を機能させるかどうかは、C#チーム次第です。

C#チームがそれについて考える方法はよく公開されています。考えられるすべての機能は-100ポイントから始まり、機能の設計、実装、文書化、および保守に関連する作業を正当化するために+100に到達するための真剣な動機付けが必要です。私は彼らのために話すことはできませんが、これが0を超えることを真剣に疑っています。代替案は明白で単純なので、それだけの価値はありません。

于 2013-01-11T17:53:37.627 に答える
1

なぜこの機能が含まれていなかったのか、具体的なドキュメントはわかりません。

私の推測では、.NETのリリースごとに実装できる機能の数には限りがあり、1日の終わりに、この機能が有益であると考える人の数は、実装に時間を費やすことを正当化しないと判断しました。 (特に、必要なことを正確に実行するコンストラクターがあることを考慮してください)。

私はこの質問を見つけました、そしてそれはあなたの質問に直接答えませんが、それは.NETのchar配列と文字列の間の重要な違いのいくつかに入ります。.NETでは、文字列はcharの配列と同じではありません(C ++の場合のように)。おそらく彼らはこの概念を打ち負かそうとしていたのでしょう。

于 2013-01-11T17:25:57.407 に答える
0

あなたはいつでも次のようなものを持つことができます:

char[] chars = { 'a','b','c','d' };
string s = new string(chars);
于 2013-01-11T17:29:35.397 に答える
0

文字配列は文字列と同じではないため、直接割り当てることはできません。それは私には何よりも良い理由のように思えます。

私はこのようなことをします:

char[] arr = { 'a', 'b', 'c' };
string s = new String(arr);
于 2013-01-11T17:30:33.327 に答える
0

基本クラスライブラリでは、主に値型を含まない暗黙的(または明示的)な表現変更変換の例を見つけるのは難しいでしょう(今のところ、、、、、、、の間の変換数しか考えられbyteませんおよび署名付き/署名なしのバリアント)。shortintlongfloatdouble

その変換が実装されなかった理由については...

  • 文字の配列と文字列の動作は大きく異なります。
  • 読みやすさ/理解しやすさの低下は、開発者の利便性の向上よりも高くなります。
    • 開発者の利便性の向上:入力する文字が12文字少なくなります。
    • 読みやすさの喪失:
      • 読者は知っておく必要があります:
      • 変換が存在すること。
      • ターゲット変数がaであるstringchar[];であるか。
      • 変換によって新しいstringオブジェクトが作成され、割り当てられること。
于 2013-01-11T17:59:04.547 に答える
0

コンパイラは、使用するタイプを正確にどのように理解する必要がありますか?

void DoIt(string data)
{
}

void DoIt(char[] data)
{
}

これらのメソッドのどれを呼び出す必要がありますか?

DoIt(new[] { 'р', 'у', 'с', 'с', 'к', 'и', 'й', ' ', 'я', 'з', 'ы', 'к' })

この機能を割り当てのためだけに残すと、不適切に設計されたシンタックスシュガーのように見えます。

于 2013-01-11T18:00:36.927 に答える