char
C# の結果をint
型に2 つ追加するのはなぜですか?
たとえば、これを行うと:
var pr = 'R' + 'G' + 'B' + 'Y' + 'P';
pr
変数は型になりint
ます。string
の値を持つ型であると予想します"RGBYP"
。
なぜC#はこのように設計されているのですか? 2 つの s を追加するデフォルトの実装は、 ではなく、 sを連結するchar
結果になるはずではありませんでしたか?string
char
int
char のドキュメントによると、暗黙的に整数値に変換できます。char
タイプはカスタムを定義しないため、operator +
整数用のカスタムが使用されます。
文字列への暗黙的な変換が存在しない理由は、Eric Lippert のブログ エントリの最初のコメント「なぜ char は暗黙的に ushort に変換されるのに、その逆ではないのか?」でよく説明されています。:
v1.0 で考慮されました。1999 年 6 月 6 日の言語設計ノートには、「そのような変換が存在するかどうかを検討した結果、この変換を行うための 3 番目の方法を提供するのは奇妙であると判断しました。[言語] は既に c.ToString() と new の両方をサポートしています。文字列(c)".
Char オブジェクトの値は、16 ビットの数値 (序数) 値です。
char は整数型です。文字ではなく数字です!
'a'
数字の省略形です。
したがって、2 文字を足すと数字になります。
仕様の別の関連ビット、セクション 4.1.5 (整数型) でchar
整数型として定義されています。
二項
+
演算子 ... の場合、オペランドは typeT
に変換されます。ここで、T
は 、 、 の最初のものでint
、uint
両方のオペランドのすべての可能な値を完全に表すことができますlong
。ulong
したがって、 a のchar
場合、両方が に変換されてからsint
として追加されint
ます。
MSDNから:
メソッドの呼び出しや割り当てステートメントなど、多くの状況で暗黙的な変換が発生する可能性があります。
char は、ushort、int、uint、long、ulong、float、double、または decimal に暗黙的に変換できます。したがって、その代入演算は暗黙的に char を int に変換します。
char
orSystem.Char
は整数型です。
0 ~ 65535 の値を持つ符号なし 16 ビット整数を表す整数型。この型に使用できる値のセットは、Unicode 文字セットに対応しています。
uint16
これは、またはとまったく同じように動作することを意味します。したがってSystem.UInt16
、演算子で文字を+
追加すると、整数値が追加されます。これは、+
演算子が でオーバーロードされていないためchar
です。
個々の文字を文字列に連結するには、StringBuilder.Append(char)
またはを使用しますnew String(char[])
。
言われたように、それは char がそのユニコード値を含む Int32 値を持っているためです。
文字を文字列に連結する場合は、次のいずれかを実行できます。
文字の配列を新しい文字列に渡します。
var pr = new string(new char[] { 'R', 'G', 'B', 'Y', 'P' });
StringBuilder を使用します。
StringBuilder sb = new StringBuilder();
sb.Append('R');
etc...
文字列から始めます。
var pr = string.Empty + 'R' + 'G' + 'B' + 'Y' + 'P';
それぞれを文字列にキャストします (または最初のものだけでも同様に機能します):
var pr = (string)'R' + (string)'G' + (string)'B' + (string)'Y' + (string)'P';
それは非効率的であるため、そうすべきではありません。そのような文字を連結したい場合は、文字列ビルダーを使用する必要があります。そうしないと、各追加により、連結された部分文字列を保持するための一時メモリが作成されます。つまり、例では 4 つの一時メモリ割り当てが発生する必要があります。
1) 定義 (MSDN):
char キーワードは、世界中で知られているほとんどの書き言葉を表すために使用される 16 ビット文字を宣言するために使用されます。
2) char が数値型を好むのはなぜですか?
A char can be implicitly converted to a numeric type.
char は文字列よりも整数に近いです。文字列は char オブジェクトのコレクションにすぎませんが、整数は char を表すことができ、その逆も同様です。
3) 例
コンパイラの裏をかくために、最初の文字を文字列に変換するだけです。
var pr = 'R'.ToString() + 'G' + 'B' + 'Y' + 'P';
char 配列を定義してから、文字列コンストラクターを使用することもできます。
char[] letters = { 'R', 'G', 'B','Y', 'P' };
string alphabet = new string(letters);
文字のみを出力したい場合は、常に文字列に変換して、そのテキスト表現を取得する必要があります。
var foo1 = 'F';
MessageBox.Show(foo1.ToString());
Char は、16 ビット整数値のテキスト表現です。int を一緒に追加するだけです。文字を連結したい場合は、それらを文字列にキャストする必要があります。
char
aが文字列型であると想定しています。a の値は、一重引用符で囲まれた文字値で表すchar
ことができますが、それが役立つ場合は、開発者に基になる値を覚えさせるのではなく、読みやすさを提供するための抽象化であると考える必要があります。実際、これは数値型であるため、文字列操作関数が適用されるとは思わないでください。
なぜ、なぜchar + char = int
?何も思いつきません。確かに、 への暗黙的な変換を提供するInt32
と、算術オーバーフローが軽減されますが、なぜshort + short
暗黙的に に型付けされないのint
でしょうか?
なぜC#はこのように設計されているのですか? 2 つの文字を追加するデフォルトの実装は、int ではなく、文字を連結した文字列になるはずではありませんか?
あなたが意図したことは、あなたが達成したいことに関して正しくありません。文字列は文字の追加ではなく、文字列はいわゆる「シングルトン」文字列の追加です。
そのため、"a"+"b"=>"ab" は、文字列の + 演算子がオーバーロードされていることを考慮すると、まったく正しいことです。したがって、'a' は ASCII char 65 を表し、'a'+'b' は 131 であると言うのは完全に一貫しています。
char と別の char は char 変数に許可されている最大値を超える可能性があるため、その演算の結果は int 変数に変換されます。