暗黙的変換と明示的変換
互換性のある型の間で安全に変換します。
「暗黙的変換と明示的変換」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
型間の変換
C#では、ある数値型を別の数値型に変換できます。自動的に行われる変換(暗黙的変換)もあれば、明示的なキャストが必要な変換もあります。
using System;
class Program
{
static void Main()
{
int i = 10;
double d = i; // implicit
int back = (int)d; // explicit
Console.WriteLine(d + ", " + back);
}
}暗黙的変換(拡大変換)
データが失われる可能性がない場合は、暗黙的変換が許可されます。たとえばintからlong、またはintからdoubleへの変換です。キャストは必要ありません。
using System;
class Program
{
static void Main()
{
int i = 42;
long l = i; // widening, safe
double d = i; // widening, safe
Console.WriteLine(l + ", " + d);
}
}拡大変換が安全な理由
変換先の型は変換元の型のすべての値を表現できるため、コンパイラは変換を暗黙的に許可します。
using System;
class Program
{
static void Main()
{
byte b = 200;
int i = b; // byte fits in int
Console.WriteLine("byte " + b + " -> int " + i);
}
}明示的変換(縮小変換)
データが失われる可能性がある場合は、明示的変換(キャスト)が必要です。たとえばdoubleからintへの変換です。(int)valueのように記述します。
using System;
class Program
{
static void Main()
{
double d = 9.78;
int i = (int)d; // truncates toward zero -> 9
Console.WriteLine(i);
}
}キャストは丸めず切り捨てる
浮動小数点値を整数にキャストすると、小数部分が削除されます。丸めは行われません。丸めたい場合は、先にMath.Roundを使ってください。
using System;
class Program
{
static void Main()
{
double d = 7.99;
Console.WriteLine("Cast: " + (int)d);
Console.WriteLine("Round: " + (int)Math.Round(d));
}
}縮小変換でのオーバーフロー
値が変換先の型に収まらない場合、通常のキャストでは値が黙って折り返されることがあります。代わりにcheckedで囲むと、オーバーフロー時に例外をスローできます。
using System;
class Program
{
static void Main()
{
int big = 300;
byte wrapped = (byte)big; // 300 wraps to 44
Console.WriteLine("Wrapped: " + wrapped);
try
{
byte safe = checked((byte)big);
Console.WriteLine(safe);
}
catch (OverflowException)
{
Console.WriteLine("checked caught overflow");
}
}
}精度の損失
非常に大きなlongをfloatに変換する場合のように、拡大変換であっても精度が失われることがあります。ただし、その変換は暗黙的に行われます。
using System;
class Program
{
static void Main()
{
long big = 9007199254740993L;
double approx = big; // implicit, may lose precision
Console.WriteLine("long: " + big);
Console.WriteLine("double: " + approx.ToString("F0"));
}
}char と数値の変換
charは対応する数値コードに暗黙的に変換でき、数値をcharに明示的にキャストすることもできます。
using System;
class Program
{
static void Main()
{
char c = 'A';
int code = c; // implicit -> 65
char next = (char)(code + 1); // explicit -> B
Console.WriteLine(code + " -> " + next);
}
}式での変換
異なる型を組み合わせた算術演算では、演算の前に小さい型が大きい型へ自動的に昇格されます。
using System;
class Program
{
static void Main()
{
int a = 7;
double b = 2;
double result = a / b; // a promoted to double -> 3.5
Console.WriteLine(result);
}
}整数除算の落とし穴
両方のオペランドが整数の場合、除算は整数除算になります。小数の結果を得るには、先に一方をdoubleにキャストしてください。
using System;
class Program
{
static void Main()
{
int a = 7, b = 2;
Console.WriteLine("int / int: " + (a / b));
Console.WriteLine("with cast: " + ((double)a / b));
}
}まとめ
安全な場合は暗黙的変換を優先し、縮小変換では明示的なキャストを使ってください。また、切り捨て、オーバーフロー、整数除算に注意しましょう。
using System;
class Program
{
static void Main()
{
int total = 17, count = 5;
double average = (double)total / count; // cast to avoid integer division
int rounded = (int)Math.Round(average);
Console.WriteLine("avg=" + average + ", rounded=" + rounded);
}
}確認問題
型変換についての理解度を確認しましょう。
要点の復習
暗黙的変換(拡大変換)は、データが失われない場合に自動的に行われます(int から long、int から double)。明示的変換(縮小変換)では(int)xのようなキャストが必要で、切り捨てやオーバーフローが起こる可能性があります。オーバーフローを検出するにはcheckedを使い、整数除算を避けるにはdoubleにキャストしてください。
using System;
class Program
{
static void Main()
{
double d = 3.9;
int i = (int)d; // explicit, truncates to 3
long l = i; // implicit widening
Console.WriteLine(i + ", " + l);
}
}よくある質問
「暗黙的変換と明示的変換」レッスンは無料ですか?
はい。「暗黙的変換と明示的変換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「暗黙的変換と明示的変換」で何を学びますか?
互換性のある型の間で安全に変換します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「暗黙的変換と明示的変換」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 値型と参照型
- ボックス化とボックス化解除
- 暗黙的変換と明示的変換
- Convertクラスと解析