はじめに
『なるほどなっとくC#入門』(はじめてプログラミングを学ぶ人を対象にしたC#の入門書)の読者の方から、こんな指摘がきました。1
C#組み込み型の表でcharが文字型とされていますが正しくは整数型です
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/language-specification/types
確かにこのページには、'char'は integral_typeに分類されています。
この事実は僕も知っていました。
実際、以下のようなコードはビルドエラーにはならず、実行することができます。
char a = 'a';
char b = 'c';
System.Console.WriteLine(a + b);
System.Console.WriteLine(a * b);
といっても、結果は、char型にはなってくれませんが...
C言語でバリバリプログラミングしていた頃は、charが整数型であることを利用したコードもよく書いていました。
しかし、「なるほどなっとくC#入門」では、組み込み型の説明では、整数型とは独立させて、charを以下の表のように文字型として分類しました。
組み込み型の種類 | キーワード |
---|---|
整数型 | byte, byte, short, short, int, uint, long, long |
文字型 | char |
.... | .... 以下略 ... |
なぜ、文字型として分類したのか
『なるほどなっとくC#入門』の「はじめに」で僕は以下のように書いています。
文法の解説では、できるだけ正確な表現になるように努めましたが、正確で詳細な文法解説は、退屈であると同時に無用な混乱を招いてしまう恐れがあります。そのため、わかりやすさと正確さのバランスをとりながら説明するようにしました。
つまり、charを整数型に分類し説明することは、初心者には無用な混乱を招くと判断したわけです。
実際に、char型を整数型として扱う場面はほんのわずかであり、整数型とは独立したchar型として説明するほうが、理解が進むというのが僕の考えです。
Microsoft Docsの他のページではどう説明されているのか
これだけでは、僕の独りよがりみたいな意見で終わってしまうので、Microsoft Docsの他のページでは、どのように説明されているのか見てみましょう。
値型 (C# リファレンス) では、以下のように説明されています。
C# には、単純型とも呼ばれる次の組み込み値型が用意されています。
整数数値型
浮動小数点数値型
ブール値を表す bool
Unicode UTF-16 文字を表す char
char型は、整数型とは別に独立させています。
また、C# 型の既定値 (C# リファレンス)では、以下のような記述があります。
種類 既定値 任意の組み込み整数数値型 0 (ゼロ) char '\0' (U+0000)
整数数値型 (C# リファレンス)では、以下のような記述があります。
C# では、次の定義済みの整数型がサポートされています。
C# 型/キーワード 範囲 サイズ .NET 型 sbyte -128 ~ 127 符号付き 8 ビット整数 System.SByte byte 0 ~ 255 符号なし 8 ビット整数 System.Byte short -32,768 ~ 32,767 符号付き 16 ビット整数 System.Int16 ushort 0 ~ 65,535 符号なし 16 ビット整数 System.UInt16 int -2,147,483,648 ~ 2,147,483,647 符号付き 32 ビット整数 System.Int32 uint 0 ~ 4,294,967,295 符号なし 32 ビット整数 System.UInt32 long -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 符号付き 64 ビット整数 System.Int64 ulong 0 ~ 18,446,744,073,709,551,615 符号なし 64 ビット整数 System.UInt64
この表にはcharは含まれていません。
これらのページでは、charは整数型とは別の型であるという立場をとっているように見えます。
結論
ということで、僕の結論は以下の通りです。
C#の言語仕様的には、char型は整数型に分類されているが、C#を説明する上では、charを整数型とは別の型として説明することは間違いではなく、むしろchar型は整数型とは別の型として説明するべきものである。
もちろん、C#の仕様を理解したエンジニアのかたが、「char型は整数型である」と主張することに異論を唱えるつもりはありません。
ある程度、理解が進んだ方には、「char型は算術演算が可能でint型の結果が生成される」ということを知ることも有意義だと思います。
ただ、C#を教えるという立場からすると、経験の浅いプログラマーが、嬉々としてcharを整数型として使うようなケースが出てくることのほうが怖いなーと思ったりもしてしまいます。
-
出版社経由の匿名の読者様ということで直接僕の考えをお伝えすることはできませんでした。 ↩