C#の型変換を完全解説|キャスト・Parse・TryParse・Convertの違いと使い分け

はじめに

C#で開発していると、「文字列を数値に変換したい」「小数を整数にしたい」「object型の値を本来の型として扱いたい」「ユーザー入力を安全にDateTimeへ変換したい」といった場面が頻繁にあります。こうした処理をまとめて型変換と呼びます。

C#の型変換には、主に次のような方法があります。

C#
int number1 = int.Parse("123");
bool success = int.TryParse("123", out int number2);
int number3 = Convert.ToInt32("123");
double value = (double)10;

一見どれも似ていますが、キャスト・Parse・TryParse・Convertは使うべき場面が異なります。使い分けを誤ると、FormatExceptionInvalidCastExceptionOverflowExceptionNullReferenceExceptionなどのエラーにつながります。

この記事では、C#の型変換について、基本から実践的な使い分けまで詳しく解説します。

1. C#の型変換とは?まず押さえるべき基本

C#の型変換とは、あるデータ型の値を別のデータ型として扱えるように変換することです。

たとえば、次のような処理が型変換です。

C#
string text = "100";
int number = int.Parse(text);

この例では、"100"という文字列をint型の数値100に変換しています。

C#は静的型付け言語なので、変数にはあらかじめ型があります。そのため、異なる型の値を代入したり計算したりする場合には、型変換が必要になることがあります。

1-1. 型変換が必要になる場面

C#の型変換が必要になる代表的な場面は次のとおりです。

ユーザーが入力した文字列を数値として扱う場合です。

C#
Console.Write("年齢を入力してください: ");
string input = Console.ReadLine();

int age = int.Parse(input);

ファイルやCSVから読み込んだ文字列を数値や日付に変換する場合にも型変換が必要です。

C#
string priceText = "1980";
int price = int.Parse(priceText);

数値型同士を変換する場面もよくあります。

C#
double average = 85.7;
int score = (int)average;

また、object型で受け取った値を具体的な型として扱う場合にも型変換が使われます。

C#
object value = 123;
int number = (int)value;

このように、C#の型変換は日常的な開発で必ず使う重要な処理です。

1-2. 値型・参照型・stringで型変換の考え方が変わる

C#の型変換を理解するには、変換元と変換先の型の種類を意識する必要があります。

まず、intdoubledecimalboolDateTimeなどは値型です。

C#
int number = 10;
double value = number;

値型同士の変換では、データの範囲や精度に注意します。たとえば、intからdoubleへの変換は安全ですが、doubleからintへの変換では小数部分が失われます。

次に、クラスや配列などは参照型です。

C#
object obj = "Hello";
string text = (string)obj;

参照型の変換では、実際のオブジェクトが変換先の型として扱えるかが重要です。扱えない型にキャストするとInvalidCastExceptionが発生します。

そして、stringは参照型ですが、型変換では特別に扱われることが多い型です。

C#
string text = "123";
int number = int.Parse(text);

stringからintDateTimeへ変換する場合は、単純なキャストではなく、ParseTryParseConvertなどを使います。

1-3. 暗黙的な型変換と明示的な型変換の違い

C#の型変換には、暗黙的な型変換明示的な型変換があります。

暗黙的な型変換は、C#が自動で行う型変換です。データが失われる可能性が低い場合に使えます。

C#
int number = 100;
long bigNumber = number;
double doubleValue = number;

この例では、intlongdoubleに代入しています。intよりlongdoubleのほうが表現できる範囲が広いため、明示的なキャストを書かなくても変換できます。

一方、明示的な型変換は、開発者が意図して行う型変換です。

C#
double value = 123.45;
int number = (int)value;

この例では、doubleからintへ変換しています。小数部分が失われるため、C#は自動変換しません。開発者が(int)と書くことで、明示的に変換を指示します。

C#
Console.WriteLine(number); // 123

123.45intにキャストすると、四捨五入ではなく小数部分が切り捨てられます。

1-4. 型変換でよく起きるエラーと注意点

C#の型変換では、次のようなエラーがよく発生します。

FormatExceptionは、文字列の形式が変換先の型に合わない場合に発生します。

C#
int number = int.Parse("abc");

"abc"は整数として解釈できないため、例外が発生します。

InvalidCastExceptionは、キャストできない型に変換しようとした場合に発生します。

C#
object value = "123";
int number = (int)value;

このコードは一見変換できそうに見えますが、objectの中身はstringです。stringを直接intへキャストすることはできないため、InvalidCastExceptionになります。

正しくは次のように書きます。

C#
object value = "123";
int number = int.Parse((string)value);

OverflowExceptionは、変換先の型で表現できる範囲を超えた場合に発生します。

C#
int number = int.Parse("999999999999999999999");

NullReferenceExceptionは、nullのオブジェクトに対してメソッドを呼び出した場合に発生します。

C#
string text = null;
int length = text.Length;

型変換では、変換元の値が正しい形式か、範囲内か、nullではないかを確認することが重要です。

2. C#の型変換方法一覧|キャスト・Parse・TryParse・Convertの違い

C#の型変換では、代表的に次の4つを使います。

C#
(int)value
int.Parse(text)
int.TryParse(text, out int result)
Convert.ToInt32(value)

どれも型変換に使いますが、目的や安全性が異なります。

2-1. 主要な型変換方法の比較表

方法主な用途nullへの対応失敗時の挙動向いている場面
キャスト型同士の直接変換型による例外が発生する数値型同士、参照型の変換
Parse文字列を特定の型に変換基本的に不可例外が発生する正しい形式だと保証できる文字列
TryParse文字列を安全に変換失敗扱いfalseを返すユーザー入力、CSV、外部データ
Convertさまざまな型を変換一部対応例外が発生する場合ありobject型やnullを含む変換

それぞれの特徴を理解して使い分けることで、読みやすく安全なコードを書けます。

2-2. キャストを使うべきケース

キャストは、型同士を直接変換したい場合に使います。

C#
double value = 10.5;
int number = (int)value;

数値型同士の変換や、継承関係のある参照型の変換でよく使います。

C#
object obj = "Hello";
string text = (string)obj;

ただし、文字列"123"intにするような変換にはキャストは使えません。

C#
string text = "123";
// int number = (int)text; // コンパイルエラー

文字列から数値へ変換する場合は、ParseTryParseを使います。

2-3. Parseを使うべきケース

Parseは、文字列を数値、日付、真偽値などに変換するときに使います。

C#
string text = "123";
int number = int.Parse(text);

日付にも使えます。

C#
string dateText = "2026/06/07";
DateTime date = DateTime.Parse(dateText);

Parseは変換に失敗すると例外を投げます。そのため、入力値が正しいと確実に分かっている場合に向いています。

2-4. TryParseを使うべきケース

TryParseは、変換に成功したかどうかをboolで返す安全な変換方法です。

C#
string text = "123";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値に変換できません");
}

ユーザー入力、CSV、APIレスポンス、設定ファイルなど、値が必ず正しいとは限らない場合はTryParseが適しています。

2-5. Convertを使うべきケース

Convertクラスは、さまざまな型を別の型に変換するためのメソッドを提供します。

C#
string text = "123";
int number = Convert.ToInt32(text);

object型の値を変換するときにも便利です。

C#
object value = "123";
int number = Convert.ToInt32(value);

また、Convert.ToInt32(null)0を返します。

C#
string text = null;
int number = Convert.ToInt32(text);

Console.WriteLine(number); // 0

この挙動は便利ですが、nullが本当に0として扱われてよいのかは慎重に判断する必要があります。

2-6. 迷ったときの使い分け早見表

やりたいこと推奨方法
stringintに安全に変換したいint.TryParse
正しい文字列をintに変換したいint.Parse
objectintに変換したいConvert.ToInt32または型確認後にキャスト
doubleintに変換したいキャスト、Math.RoundConvert.ToInt32
intstringに変換したいToString()
stringDateTimeに安全に変換したいDateTime.TryParse
型が合う参照型へ変換したいキャスト、asis

基本的には、外部から来る不確実な文字列にはTryParse、型が明確な変換にはキャスト、objectnullを含む変換にはConvertを検討すると分かりやすいです。

3. キャストによる型変換

キャストは、C#の型変換の中でも基本的な方法です。特に数値型同士の変換や、参照型の変換でよく使います。

3-1. キャストの基本構文

キャストの基本構文は次のとおりです。

C#
変換先の型 変数名 = (変換先の型)変換元;

具体例です。

C#
double value = 123.45;
int number = (int)value;

(int)の部分がキャストです。

参照型でも使えます。

C#
object obj = "Hello";
string text = (string)obj;

ただし、変換できない型にキャストすると例外が発生します。

3-2. 数値型同士のキャスト

数値型同士の変換では、暗黙的な変換と明示的な変換があります。

intからdoubleへの変換は暗黙的にできます。

C#
int number = 100;
double value = number;

一方、doubleからintへの変換は明示的なキャストが必要です。

C#
double value = 100.9;
int number = (int)value;

Console.WriteLine(number); // 100

小数部分は切り捨てられます。

また、longからintのように、変換先の範囲が狭くなる場合も明示的なキャストが必要です。

C#
long bigNumber = 1000;
int number = (int)bigNumber;

範囲を超える値を変換すると、意図しない結果になる可能性があります。

3-3. 小数から整数への変換とデータ欠落

小数から整数へキャストすると、小数部分は切り捨てられます。

C#
double value1 = 10.9;
double value2 = 10.1;

Console.WriteLine((int)value1); // 10
Console.WriteLine((int)value2); // 10

四捨五入したい場合は、キャストではなくMath.Roundを使います。

C#
double value = 10.9;
int rounded = (int)Math.Round(value);

Console.WriteLine(rounded); // 11

切り上げにはMath.Ceiling、切り捨てにはMath.Floorを使います。

C#
double value = 10.2;

Console.WriteLine(Math.Ceiling(value)); // 11
Console.WriteLine(Math.Floor(value)); // 10

doubleintに変換するときは、「小数部分をどう扱いたいのか」を明確にしてから変換方法を選びましょう。

3-4. 参照型のキャスト

参照型のキャストは、継承関係や実際のオブジェクトの型に基づいて行います。

C#
object obj = "Hello";
string text = (string)obj;

この例では、objの実体がstringなので、stringへのキャストに成功します。

一方、次のコードは失敗します。

C#
object obj = 123;
string text = (string)obj; // InvalidCastException

objの実体はintです。intstringに直接キャストすることはできません。

文字列として取得したい場合は、ToString()Convert.ToString()を使います。

C#
object obj = 123;
string text = obj.ToString();

または次のように書けます。

C#
object obj = 123;
string text = Convert.ToString(obj);

3-5. as演算子とis演算子の使い方

参照型の変換では、as演算子とis演算子もよく使います。

as演算子は、変換に失敗した場合に例外を投げず、nullを返します。

C#
object obj = "Hello";

string text = obj as string;

if (text != null)
{
Console.WriteLine(text);
}

変換できない場合はnullになります。

C#
object obj = 123;

string text = obj as string;

Console.WriteLine(text == null); // True

is演算子は、指定した型かどうかを判定します。

C#
object obj = "Hello";

if (obj is string)
{
string text = (string)obj;
Console.WriteLine(text);
}

最近のC#では、パターンマッチングを使って次のように書けます。

C#
object obj = "Hello";

if (obj is string text)
{
Console.WriteLine(text);
}

この書き方なら、型チェックと変数への代入を同時に行えます。

3-6. InvalidCastExceptionが発生する原因

InvalidCastExceptionは、実行時に型変換できないキャストを行ったときに発生します。

よくある原因は、objectに入っている値の実体と変換先の型が一致していないことです。

C#
object obj = "123";
int number = (int)obj; // InvalidCastException

このコードでは、objの中身はstringです。たとえ文字列の内容が"123"でも、stringを直接intにキャストすることはできません。

正しくは次のようにします。

C#
object obj = "123";
int number = int.Parse((string)obj);

より安全に書くなら、TryParseを使います。

C#
object obj = "123";

if (obj is string text && int.TryParse(text, out int number))
{
Console.WriteLine(number);
}

参照型のキャストでは、変換前にisで型を確認すると安全です。

4. Parseによる文字列から数値・日付への型変換

Parseは、文字列を特定の型に変換するためのメソッドです。intdoubledecimalDateTimeboolなど、多くの型にParseメソッドがあります。

4-1. Parseの基本構文

Parseの基本構文は次のとおりです。

C#
変換先の型 変数名 = .Parse(文字列);

例です。

C#
string text = "123";
int number = int.Parse(text);

doubleDateTimeでも同じように使えます。

C#
double value = double.Parse("123.45");
DateTime date = DateTime.Parse("2026/06/07");

Parseは、文字列が正しい形式であることを前提に変換します。形式が不正な場合は例外が発生します。

4-2. stringからintへ変換する方法

stringからintへ変換するには、int.Parseを使います。

C#
string text = "100";
int number = int.Parse(text);

Console.WriteLine(number); // 100

前後に空白があっても変換できる場合があります。

C#
string text = " 100 ";
int number = int.Parse(text);

Console.WriteLine(number); // 100

ただし、小数を表す文字列はint.Parseでは変換できません。

C#
int number = int.Parse("10.5"); // FormatException

整数として変換したい場合は、いったんdoubledecimalとして扱うか、入力形式を見直す必要があります。

4-3. stringからdouble・decimalへ変換する方法

小数を含む文字列を変換する場合は、double.Parsedecimal.Parseを使います。

C#
string text = "123.45";
double value = double.Parse(text);

Console.WriteLine(value); // 123.45

金額など、誤差を避けたい数値にはdecimalが向いています。

C#
string priceText = "1980.50";
decimal price = decimal.Parse(priceText);

Console.WriteLine(price); // 1980.50

doubleは科学計算や計測値などに使われることが多く、decimalは金額計算に使われることが多いです。

ただし、小数点の記号はカルチャ設定に影響を受ける場合があります。環境によっては.ではなく,が小数点として扱われることもあります。

カルチャを明示したい場合は、CultureInfoを指定します。

C#
using System.Globalization;

string text = "123.45";
double value = double.Parse(text, CultureInfo.InvariantCulture);

4-4. stringからDateTimeへ変換する方法

日付文字列をDateTimeに変換するには、DateTime.Parseを使います。

C#
string text = "2026/06/07";
DateTime date = DateTime.Parse(text);

Console.WriteLine(date);

ただし、日付形式は環境やカルチャの影響を受けます。

たとえば、"01/02/2026"が「2026年1月2日」なのか「2026年2月1日」なのかは、文化圏によって解釈が変わる可能性があります。

日付形式が決まっている場合は、DateTime.ParseExactを使うと安全です。

C#
using System.Globalization;

string text = "2026-06-07";
DateTime date = DateTime.ParseExact(
text,
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

ParseExactでは、指定した形式と一致しない文字列は変換できません。そのため、ログファイルやCSVなど、日付形式が固定されているデータに向いています。

4-5. ParseでFormatExceptionが発生するケース

Parseでよく発生するのがFormatExceptionです。

代表的な原因は、文字列が変換先の型として正しい形式ではないことです。

C#
int number = int.Parse("abc");

空文字も変換できません。

C#
int number = int.Parse("");

小数文字列をint.Parseで変換しようとしても失敗します。

C#
int number = int.Parse("10.5");

日付として不正な文字列も失敗します。

C#
DateTime date = DateTime.Parse("not date");

このように、Parseは入力値が正しいことを前提にするメソッドです。不正な値が混じる可能性があるなら、TryParseを使うほうが安全です。

4-6. Parseを使う際に例外処理が必要な理由

Parseは変換に失敗すると例外を投げます。そのため、外部入力に対してそのまま使うと、プログラムが途中で停止する原因になります。

C#
try
{
string text = "abc";
int number = int.Parse(text);
Console.WriteLine(number);
}
catch (FormatException)
{
Console.WriteLine("数値の形式が正しくありません。");
}

ただし、変換に失敗する可能性が高い処理で毎回例外処理を使うのはおすすめできません。例外は本来、通常の制御フローではなく、予期しない問題を扱うための仕組みです。

ユーザー入力のように失敗が想定される場合は、TryParseを使うほうが自然です。

C#
if (int.TryParse("abc", out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値に変換できません。");
}

5. TryParseによる安全な型変換

TryParseは、C#の型変換で非常によく使われる安全な方法です。変換に失敗しても例外を投げず、成功したかどうかをboolで返します。

5-1. TryParseの基本構文

TryParseの基本構文は次のとおりです。

C#
bool 成功したか = .TryParse(文字列, out 変換結果);

具体例です。

C#
string text = "123";

bool success = int.TryParse(text, out int number);

if (success)
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("変換に失敗しました。");
}

TryParseは、変換に成功するとtrueを返し、out引数に変換結果を格納します。失敗するとfalseを返します。

5-2. TryParseの戻り値とout引数の意味

TryParseの戻り値は、変換が成功したかどうかを表します。

C#
bool success = int.TryParse("123", out int number);

この場合、successtruenumber123になります。

失敗した場合は次のようになります。

C#
bool success = int.TryParse("abc", out int number);

Console.WriteLine(success); // False
Console.WriteLine(number); // 0

変換に失敗した場合、out引数には型の既定値が入ります。intなら0doubleなら0boolならfalseDateTimeならDateTime.MinValueです。

ただし、失敗時の値をそのまま使うべきではありません。必ず戻り値を確認してから結果を使いましょう。

C#
if (int.TryParse("abc", out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("変換できませんでした。");
}

5-3. int.TryParseの実用例

ユーザー入力をintに変換する場合、int.TryParseが適しています。

C#
Console.Write("年齢を入力してください: ");
string input = Console.ReadLine();

if (int.TryParse(input, out int age))
{
Console.WriteLine($"年齢は{age}歳です。");
}
else
{
Console.WriteLine("年齢は整数で入力してください。");
}

さらに、範囲チェックも組み合わせると実用的です。

C#
Console.Write("年齢を入力してください: ");
string input = Console.ReadLine();

if (int.TryParse(input, out int age) && age >= 0 && age <= 120)
{
Console.WriteLine($"年齢は{age}歳です。");
}
else
{
Console.WriteLine("0〜120の整数で入力してください。");
}

型変換に成功したかどうかだけでなく、業務上正しい値かどうかもチェックすることが大切です。

5-4. double.TryParse・DateTime.TryParseの実用例

小数を安全に変換するには、double.TryParseを使います。

C#
string input = "123.45";

if (double.TryParse(input, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("小数に変換できません。");
}

金額の場合はdecimal.TryParseがよく使われます。

C#
string input = "1980.50";

if (decimal.TryParse(input, out decimal price))
{
Console.WriteLine($"価格: {price}");
}
else
{
Console.WriteLine("価格の形式が正しくありません。");
}

日付を安全に変換する場合は、DateTime.TryParseを使います。

C#
string input = "2026/06/07";

if (DateTime.TryParse(input, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付に変換できません。");
}

日付形式が固定されている場合は、DateTime.TryParseExactが便利です。

C#
using System.Globalization;

string input = "2026-06-07";

if (DateTime.TryParseExact(
input,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("yyyy-MM-dd形式で入力してください。");
}

5-5. ユーザー入力やCSV読み込みでTryParseが向いている理由

ユーザー入力やCSVファイルの値は、常に正しいとは限りません。

たとえば、年齢欄に次のような値が入る可能性があります。

25
未入力
abc
30歳
999999999999999999

これらをint.Parseで処理すると、途中で例外が発生する可能性があります。

C#
int age = int.Parse(input);

一方、TryParseなら変換できない値を安全に判定できます。

C#
if (int.TryParse(input, out int age))
{
Console.WriteLine(age);
}
else
{
Console.WriteLine("不正な年齢です。");
}

CSVのように大量のデータを処理する場合、1件の不正データで全体の処理が停止するのは望ましくありません。TryParseを使えば、不正な行だけスキップしたり、エラーログに記録したりできます。

C#
foreach (string line in lines)
{
string[] columns = line.Split(',');

if (int.TryParse(columns[0], out int id))
{
Console.WriteLine($"ID: {id}");
}
else
{
Console.WriteLine($"不正なID: {columns[0]}");
}
}

5-6. ParseではなくTryParseを選ぶべき場面

次のような場面では、ParseではなくTryParseを選ぶべきです。

ユーザーが入力した値を変換する場合です。

C#
int.TryParse(input, out int number);

CSV、JSON、設定ファイルなど、外部から受け取った文字列を変換する場合です。

C#
decimal.TryParse(priceText, out decimal price);

変換失敗が通常の処理として起こり得る場合です。

C#
if (!DateTime.TryParse(dateText, out DateTime date))
{
Console.WriteLine("日付が不正です。");
}

一方、コード内で固定された文字列や、事前に検証済みの文字列であれば、Parseでも問題ありません。

C#
int number = int.Parse("123");

実務では、外部入力にはTryParse、内部で保証された値にはParseと考えると分かりやすいです。

6. Convertクラスによる型変換

Convertクラスは、さまざまな型を別の型へ変換するための静的メソッドを提供します。ToInt32ToStringToDoubleToBooleanなどがよく使われます。

6-1. Convert.ToInt32の基本構文

Convert.ToInt32は、値をintに変換します。

C#
string text = "123";
int number = Convert.ToInt32(text);

Console.WriteLine(number); // 123

doubleからintへの変換にも使えます。

C#
double value = 123.45;
int number = Convert.ToInt32(value);

Console.WriteLine(number); // 123

ただし、Convert.ToInt32で小数を整数に変換する場合、単純なキャストとは挙動が異なります。

C#
Console.WriteLine((int)123.9);              // 123
Console.WriteLine(Convert.ToInt32(123.9)); // 124

キャストは小数部分を切り捨てますが、Convert.ToInt32は丸め処理を行います。この違いは重要です。

6-2. Convert.ToString・Convert.ToDouble・Convert.ToBooleanの使い方

Convert.ToStringは、値を文字列に変換します。

C#
int number = 123;
string text = Convert.ToString(number);

Console.WriteLine(text); // "123"

Convert.ToDoubleは、値をdoubleに変換します。

C#
string text = "123.45";
double value = Convert.ToDouble(text);

Console.WriteLine(value); // 123.45

Convert.ToBooleanは、値をboolに変換します。

C#
string text = "true";
bool flag = Convert.ToBoolean(text);

Console.WriteLine(flag); // True

数値からboolへの変換では、0false0以外はtrueになります。

C#
Console.WriteLine(Convert.ToBoolean(0)); // False
Console.WriteLine(Convert.ToBoolean(1)); // True
Console.WriteLine(Convert.ToBoolean(2)); // True

6-3. ConvertとParseの違い

ConvertParseはどちらも文字列から数値への変換に使えます。

C#
int number1 = int.Parse("123");
int number2 = Convert.ToInt32("123");

大きな違いは、nullへの対応です。

C#
string text = null;

// int.Parse(text); // ArgumentNullException
int number = Convert.ToInt32(text); // 0

int.Parse(null)は例外になりますが、Convert.ToInt32(null)0を返します。

また、Convertは文字列以外の型も広く受け取れます。

C#
object value = "123";
int number = Convert.ToInt32(value);

一方、Parseは基本的に文字列を対象にします。

C#
string text = "123";
int number = int.Parse(text);

文字列の形式が正しいと分かっているならParseobjectnullが絡むならConvertを検討するとよいでしょう。

6-4. nullを変換したときの挙動

Convertは、nullを変換したときに型ごとの既定値を返す場合があります。

C#
string text = null;

Console.WriteLine(Convert.ToInt32(text)); // 0
Console.WriteLine(Convert.ToDouble(text)); // 0
Console.WriteLine(Convert.ToBoolean(text)); // False
Console.WriteLine(Convert.ToString(text)); // ""

この挙動は便利ですが、注意も必要です。

たとえば、売上金額がnullだった場合に0へ変換されると、「本当に0円だった」のか「値が存在しなかった」のか区別できなくなります。

C#
string salesText = null;
int sales = Convert.ToInt32(salesText); // 0

業務上、null0を区別すべき場合は、nullable型や明示的なnullチェックを使いましょう。

C#
string salesText = null;

int? sales = salesText == null
? null
: Convert.ToInt32(salesText);

6-5. Convertで例外が発生するケース

Convertは便利ですが、常に安全なわけではありません。変換できない形式の文字列では例外が発生します。

C#
int number = Convert.ToInt32("abc"); // FormatException

範囲を超える値でも例外になります。

C#
int number = Convert.ToInt32("999999999999999999999"); // OverflowException

変換できない型を指定した場合にも例外が発生することがあります。

C#
object value = new object();
int number = Convert.ToInt32(value);

そのため、外部入力を扱う場合はConvertだけに頼らず、必要に応じてTryParseを使うことが重要です。

6-6. object型を変換するときにConvertが便利な理由

object型の値は、実際に何の型が入っているか分かりにくいことがあります。

C#
object value = "123";

この値をintにしたい場合、キャストでは失敗します。

C#
// int number = (int)value; // InvalidCastException

しかし、Convert.ToInt32なら変換できます。

C#
int number = Convert.ToInt32(value);

objectの中身がintでも変換できます。

C#
object value = 123;
int number = Convert.ToInt32(value);

中身がdoubleでも変換できます。

C#
object value = 123.45;
int number = Convert.ToInt32(value);

このように、object型で受け取った値を目的の型に変換したい場合、Convertは便利です。ただし、変換できない値が入る可能性があるなら、型チェックや例外処理を組み合わせましょう。

7. 型変換の実践パターン別使い分け

ここでは、実際によくあるC#の型変換パターンを例に、どの方法を使うべきかを解説します。

7-1. stringをintに変換したい場合

stringintに変換する場合、最も安全なのはint.TryParseです。

C#
string text = "123";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数に変換できません。");
}

値が必ず正しいと分かっている場合は、int.Parseでも構いません。

C#
string text = "123";
int number = int.Parse(text);

null0として扱ってもよい場合は、Convert.ToInt32も使えます。

C#
string text = null;
int number = Convert.ToInt32(text); // 0

ただし、一般的にはユーザー入力や外部データにはTryParseを使うのが安全です。

7-2. intをstringに変換したい場合

intstringに変換する場合は、ToString()を使うのが一般的です。

C#
int number = 123;
string text = number.ToString();

Console.WriteLine(text); // "123"

文字列補間を使う方法もあります。

C#
int number = 123;
string text = $"{number}";

Convert.ToStringも使えます。

C#
int number = 123;
string text = Convert.ToString(number);

通常はToString()で十分です。フォーマットを指定したい場合もToStringを使います。

C#
int number = 123;
string text = number.ToString("D5");

Console.WriteLine(text); // 00123

7-3. doubleをintに変換したい場合

doubleintに変換する場合は、小数部分の扱いに注意が必要です。

単純に小数部分を切り捨てるならキャストを使います。

C#
double value = 123.9;
int number = (int)value;

Console.WriteLine(number); // 123

四捨五入したい場合はMath.Roundを使います。

C#
double value = 123.9;
int number = (int)Math.Round(value);

Console.WriteLine(number); // 124

切り上げならMath.Ceilingです。

C#
double value = 123.1;
int number = (int)Math.Ceiling(value);

Console.WriteLine(number); // 124

切り捨てならMath.Floorです。

C#
double value = 123.9;
int number = (int)Math.Floor(value);

Console.WriteLine(number); // 123

Convert.ToInt32も使えますが、キャストとは違って丸めが行われます。

C#
double value = 123.9;
int number = Convert.ToInt32(value);

Console.WriteLine(number); // 124

小数を整数に変換するときは、業務ルールとして「切り捨て」「切り上げ」「四捨五入」のどれを使うのかを明確にしましょう。

7-4. objectをintやstringに変換したい場合

objectintに変換する場合、中身の型によって方法が変わります。

中身が本当にintならキャストできます。

C#
object value = 123;
int number = (int)value;

中身がstringなら、直接intへキャストはできません。

C#
object value = "123";
// int number = (int)value; // InvalidCastException

この場合は、Convert.ToInt32が便利です。

C#
object value = "123";
int number = Convert.ToInt32(value);

より安全に処理するなら、型ごとに分岐します。

C#
object value = "123";

int? number = value switch
{
int i => i,
string s when int.TryParse(s, out int result) => result,
null => null,
_ => null
};

Console.WriteLine(number);

objectstringに変換する場合は、ToString()またはConvert.ToString()を使います。

C#
object value = 123;
string text = value.ToString();

nullの可能性があるなら、Convert.ToString()のほうが安全です。

C#
object value = null;
string text = Convert.ToString(value);

Console.WriteLine(text); // ""

またはnull条件演算子を使います。

C#
object value = null;
string text = value?.ToString();

この場合、textnullになります。

7-5. nullable型を変換したい場合

nullable型は、値型にnullを許可する型です。

C#
int? number = null;

int?からintに変換する場合、値が存在するか確認する必要があります。

C#
int? nullableNumber = 123;

if (nullableNumber.HasValue)
{
int number = nullableNumber.Value;
Console.WriteLine(number);
}

nullの場合に既定値を使いたいなら、null合体演算子??を使います。

C#
int? nullableNumber = null;
int number = nullableNumber ?? 0;

Console.WriteLine(number); // 0

文字列からnullableなintへ変換するなら、次のように書けます。

C#
string text = "123";

int? number = int.TryParse(text, out int result)
? result
: null;

空文字や不正な値をnullとして扱いたい場合に便利です。

C#
string text = "";

int? number = int.TryParse(text, out int result)
? result
: null;

7-6. enumを文字列や数値に変換したい場合

enumは列挙型です。

C#
enum Status
{
None = 0,
Active = 1,
Inactive = 2
}

enumを文字列に変換するには、ToString()を使います。

C#
Status status = Status.Active;
string text = status.ToString();

Console.WriteLine(text); // Active

enumを数値に変換するには、キャストを使います。

C#
Status status = Status.Active;
int value = (int)status;

Console.WriteLine(value); // 1

文字列からenumに変換するには、Enum.ParseまたはEnum.TryParseを使います。

C#
Status status = (Status)Enum.Parse(typeof(Status), "Active");

安全に変換するならEnum.TryParseを使います。

C#
string text = "Active";

if (Enum.TryParse<Status>(text, out Status status))
{
Console.WriteLine(status);
}
else
{
Console.WriteLine("Statusに変換できません。");
}

数値からenumに変換する場合はキャストできます。

C#
int value = 1;
Status status = (Status)value;

Console.WriteLine(status); // Active

ただし、定義されていない数値でもキャストできてしまう点に注意が必要です。

C#
int value = 999;
Status status = (Status)value;

Console.WriteLine(status); // 999

定義済みの値か確認するには、Enum.IsDefinedを使います。

C#
int value = 999;

if (Enum.IsDefined(typeof(Status), value))
{
Status status = (Status)value;
Console.WriteLine(status);
}
else
{
Console.WriteLine("未定義のStatusです。");
}

7-7. 日付文字列をDateTimeに変換したい場合

日付文字列をDateTimeに変換する場合、外部入力ならDateTime.TryParseが安全です。

C#
string text = "2026/06/07";

if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付に変換できません。");
}

日付形式が固定されているなら、TryParseExactを使います。

C#
using System.Globalization;

string text = "2026-06-07";

if (DateTime.TryParseExact(
text,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付形式が正しくありません。");
}

日付の型変換では、カルチャによる解釈違いに注意しましょう。特に、MM/dd/yyyydd/MM/yyyyのような形式は混同しやすいため、可能であれば形式を明示するのがおすすめです。

8. C#の型変換でよくあるエラーと解決策

C#の型変換では、いくつかの例外がよく発生します。原因を理解しておくと、問題の切り分けがしやすくなります。

8-1. FormatExceptionの原因と対処法

FormatExceptionは、文字列の形式が変換先の型に合っていない場合に発生します。

C#
int number = int.Parse("abc");

このコードでは、"abc"が整数として解釈できないため、FormatExceptionになります。

小数文字列をint.Parseで変換した場合も発生します。

C#
int number = int.Parse("10.5");

対処法は、TryParseを使って事前に変換可能か確認することです。

C#
string text = "abc";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数に変換できません。");
}

日付の場合も同様です。

C#
string text = "not date";

if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付に変換できません。");
}

8-2. InvalidCastExceptionの原因と対処法

InvalidCastExceptionは、キャストできない型へ変換しようとした場合に発生します。

C#
object value = "123";
int number = (int)value;

valueの中身はstringなので、直接intにキャストすることはできません。

対処法は、実際の型を確認してから変換することです。

C#
object value = "123";

if (value is string text && int.TryParse(text, out int number))
{
Console.WriteLine(number);
}

またはConvert.ToInt32を使います。

C#
object value = "123";
int number = Convert.ToInt32(value);

ただし、Convertでも変換できない値では例外が発生するため、不確実な値にはTryParseを組み合わせるのが安全です。

8-3. OverflowExceptionの原因と対処法

OverflowExceptionは、変換先の型で表現できる範囲を超えた場合に発生します。

C#
int number = int.Parse("999999999999999999999");

intで扱える範囲を超えているため、例外になります。

対処法として、より大きな型を使う方法があります。

C#
long number = long.Parse("999999999999");

安全に処理するならTryParseを使います。

C#
string text = "999999999999999999999";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("intの範囲を超えているか、形式が不正です。");
}

数値型にはそれぞれ扱える範囲があります。大きな値を扱う可能性がある場合は、longdecimalBigIntegerなどの使用も検討しましょう。

8-4. NullReferenceExceptionを防ぐ方法

NullReferenceExceptionは、nullの変数に対してメソッドやプロパティを使った場合に発生します。

C#
string text = null;
string result = text.ToString(); // NullReferenceException

string型の変数に対してToString()を呼ぶ場合、変数自体がnullだと例外になります。

対処法として、null条件演算子を使えます。

C#
string text = null;
string result = text?.ToString();

nullの場合に既定値を使うなら、null合体演算子を使います。

C#
string text = null;
string result = text ?? "";

Convert.ToStringを使う方法もあります。

C#
string text = null;
string result = Convert.ToString(text);

Console.WriteLine(result); // ""

型変換前にnullの可能性を確認することで、NullReferenceExceptionを防げます。

8-5. カルチャによる小数点・日付形式の違いに注意する

C#の型変換では、カルチャによって小数点や日付の解釈が変わることがあります。

たとえば、小数点として.を使う文化圏もあれば、,を使う文化圏もあります。

C#
double value = double.Parse("123.45");

このコードは多くの環境で動作しますが、カルチャ設定によって解釈が変わる可能性があります。

形式を固定したい場合は、CultureInfo.InvariantCultureを使います。

C#
using System.Globalization;

double value = double.Parse("123.45", CultureInfo.InvariantCulture);

日付でも同じです。

C#
DateTime date = DateTime.Parse("01/02/2026");

この文字列が「1月2日」なのか「2月1日」なのかは、環境によって異なる可能性があります。

形式が決まっている場合は、ParseExactTryParseExactを使います。

C#
using System.Globalization;

string text = "2026-06-07";

DateTime date = DateTime.ParseExact(
text,
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

外部データやログを扱う場合は、カルチャ依存を避ける設計が重要です。

8-6. checked・uncheckedによるオーバーフロー制御

整数型の変換では、オーバーフローが問題になることがあります。

C#
int max = int.MaxValue;
int result = max + 1;

通常の設定では、オーバーフローが検出されず、意図しない値になる場合があります。

checkedを使うと、オーバーフロー時に例外を発生させられます。

C#
checked
{
int max = int.MaxValue;
int result = max + 1; // OverflowException
}

一方、uncheckedを使うと、オーバーフローを検出せずに処理します。

C#
unchecked
{
int max = int.MaxValue;
int result = max + 1;
Console.WriteLine(result);
}

明示的な数値変換でもcheckedを使えます。

C#
long bigValue = long.MaxValue;

checked
{
int number = (int)bigValue; // OverflowException
}

数値の範囲が重要な処理では、checkedを使って意図しないオーバーフローを防ぎましょう。

9. 型変換のベストプラクティス

C#の型変換では、単に変換できればよいわけではありません。安全性、可読性、保守性を意識して書くことが大切です。

9-1. ユーザー入力にはTryParseを使う

ユーザー入力は不正な値が入る前提で扱うべきです。

C#
Console.Write("数値を入力してください: ");
string input = Console.ReadLine();

if (int.TryParse(input, out int number))
{
Console.WriteLine($"入力値: {number}");
}
else
{
Console.WriteLine("整数を入力してください。");
}

Parseを使うと、不正な入力で例外が発生します。

C#
int number = int.Parse(input);

ユーザー入力、フォーム入力、コマンドライン引数などには、基本的にTryParseを使いましょう。

9-2. 確実に正しい文字列だけParseを使う

Parseは、文字列の形式が正しいと保証できる場合に使います。

C#
int number = int.Parse("123");

たとえば、プログラム内で固定した値や、事前にバリデーション済みの値であればParseを使っても問題ありません。

ただし、外部から来る値には注意が必要です。

C#
string input = Console.ReadLine();
int number = int.Parse(input); // 入力値によっては例外

変換失敗が想定される場面では、ParseではなくTryParseを選びましょう。

9-3. nullの可能性がある値にはConvertやnullチェックを使う

値がnullになる可能性がある場合は、事前にnullチェックを行います。

C#
string text = null;

if (text != null)
{
int number = int.Parse(text);
}

nullを既定値として扱ってよい場合は、Convertも選択肢です。

C#
string text = null;
int number = Convert.ToInt32(text); // 0

ただし、null0として扱うことが正しいかは、業務ロジックによって変わります。

null0を区別したい場合は、nullable型を使います。

C#
string text = null;

int? number = text == null
? null
: int.Parse(text);

9-4. 数値型の変換ではデータ損失に注意する

数値型の変換では、範囲や精度が失われることがあります。

C#
double value = 123.99;
int number = (int)value;

Console.WriteLine(number); // 123

小数部分が失われるため、計算結果に影響する可能性があります。

また、大きな型から小さな型へ変換する場合、範囲を超えることがあります。

C#
long bigValue = 9999999999;
int number = (int)bigValue;

安全に扱うなら、範囲チェックを行います。

C#
long bigValue = 9999999999;

if (bigValue >= int.MinValue && bigValue <= int.MaxValue)
{
int number = (int)bigValue;
Console.WriteLine(number);
}
else
{
Console.WriteLine("intの範囲を超えています。");
}

数値型の変換では、変換結果が本当に意図した値になるか確認しましょう。

9-5. 例外処理に頼りすぎない設計にする

型変換に失敗する可能性が高い処理で、毎回try-catchに頼るのはおすすめできません。

C#
try
{
int number = int.Parse(input);
}
catch
{
Console.WriteLine("変換失敗");
}

このような処理は、TryParseで書くほうが自然です。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("変換失敗");
}

例外処理は、本当に例外的な状況に使いましょう。入力ミスや不正データのように通常起こり得るものは、TryParseで制御するほうが読みやすくなります。

9-6. 可読性を意識した型変換コードを書く

型変換は短く書けますが、短さだけを優先すると読みにくくなることがあります。

たとえば、次のようなコードは意味が分かりにくくなりがちです。

C#
int number = Convert.ToInt32(obj?.ToString());

objが何の型なのか、nullならどうなるのか、変換失敗時にどうするのかが分かりにくいです。

安全性と可読性を意識するなら、処理を分けて書きます。

C#
if (obj is null)
{
Console.WriteLine("値がありません。");
}
else if (int.TryParse(obj.ToString(), out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値に変換できません。");
}

型変換では、「何を」「どの型に」「失敗したらどうするか」が読み取れるコードを書くことが大切です。

10. C#の型変換に関するよくある質問

C#の型変換でよくある疑問を整理します。

10-1. ParseとTryParseはどちらを使うべき?

外部入力やユーザー入力にはTryParseを使うべきです。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}

TryParseは変換に失敗しても例外を投げず、falseを返します。そのため、不正な入力を自然に処理できます。

一方、Parseは文字列が正しいと確実に分かっている場合に使います。

C#
int number = int.Parse("123");

実務では、迷ったらTryParseを使うのが安全です。

10-2. Convertとキャストは何が違う?

キャストは、型を直接変換します。

C#
double value = 123.45;
int number = (int)value;

参照型でも、実際の型が一致していれば変換できます。

C#
object obj = "Hello";
string text = (string)obj;

一方、Convertは値を指定した型に変換するメソッドです。

C#
object obj = "123";
int number = Convert.ToInt32(obj);

objectの中身が文字列でも数値に変換できる場合があります。

ただし、キャストとConvertでは挙動が異なることがあります。特に小数から整数への変換では注意が必要です。

C#
Console.WriteLine((int)123.9);             // 123
Console.WriteLine(Convert.ToInt32(123.9)); // 124

キャストは小数部分を切り捨て、Convert.ToInt32は丸めを行います。

10-3. int.ParseとConvert.ToInt32の違いは?

int.Parseは、文字列をintに変換します。

C#
int number = int.Parse("123");

Convert.ToInt32は、文字列だけでなく、さまざまな型をintに変換できます。

C#
int number1 = Convert.ToInt32("123");
int number2 = Convert.ToInt32(123.45);

大きな違いはnullの扱いです。

C#
string text = null;

// int.Parse(text); // 例外
int number = Convert.ToInt32(text); // 0

int.Parse(null)は例外になりますが、Convert.ToInt32(null)0を返します。

ただし、null0にしてよいかは状況によります。値がないことを区別したい場合は、nullable型やnullチェックを使いましょう。

10-4. stringからintに変換できない原因は?

stringからintに変換できない主な原因は、文字列が整数として正しい形式ではないことです。

たとえば、次の文字列はint.Parseで変換できません。

C#
"abc"
""
"10.5"
"123円"
"999999999999999999999"

対処法は、int.TryParseを使って変換可能か確認することです。

C#
string text = "123円";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数に変換できません。");
}

もし"123円"のような文字列を変換したいなら、不要な文字を取り除いてから変換します。

C#
string text = "123円";
text = text.Replace("円", "");

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}

10-5. 小数を整数に変換すると四捨五入される?

キャストの場合、小数は四捨五入されません。小数部分が切り捨てられます。

C#
double value = 10.9;
int number = (int)value;

Console.WriteLine(number); // 10

四捨五入したい場合は、Math.Roundを使います。

C#
double value = 10.9;
int number = (int)Math.Round(value);

Console.WriteLine(number); // 11

Convert.ToInt32を使った場合は丸めが行われます。

C#
double value = 10.9;
int number = Convert.ToInt32(value);

Console.WriteLine(number); // 11

ただし、丸めのルールを明確にしたい場合は、Math.RoundMath.FloorMath.Ceilingを使って意図をコードに表すのがおすすめです。

10-6. 型変換で例外を出さない方法は?

文字列から数値や日付へ変換する場合は、TryParseを使うと例外を避けられます。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("変換できません。");
}

日付の場合も同じです。

C#
if (DateTime.TryParse(input, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付に変換できません。");
}

参照型のキャストでは、isasを使うと安全です。

C#
object obj = "Hello";

if (obj is string text)
{
Console.WriteLine(text);
}

asを使う方法もあります。

C#
object obj = "Hello";

string text = obj as string;

if (text != null)
{
Console.WriteLine(text);
}

型変換で例外を出さないためには、変換前に「型」「形式」「範囲」「null」を確認することが重要です。

まとめ

C#の型変換には、キャスト、ParseTryParseConvertなど複数の方法があります。それぞれ用途が異なるため、違いを理解して使い分けることが大切です。

キャストは、数値型同士の変換や参照型の変換に使います。

C#
double value = 123.45;
int number = (int)value;

Parseは、正しい形式だと分かっている文字列を数値や日付に変換するときに使います。

C#
int number = int.Parse("123");

TryParseは、ユーザー入力やCSVなど、不正な値が混じる可能性がある場面に向いています。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}

Convertは、object型やnullを含む変換で便利です。

C#
object value = "123";
int number = Convert.ToInt32(value);

ただし、どの方法でも万能ではありません。C#の型変換では、変換元の値が正しい形式か、変換先の範囲に収まるか、nullではないか、データ損失が起きないかを意識する必要があります。

特に実務では、次の使い分けを覚えておくと便利です。

場面おすすめの方法
ユーザー入力を数値にしたいTryParse
正しい文字列を数値にしたいParse
数値型同士を変換したいキャスト
object型を変換したいConvertまたは型チェック
nullの可能性があるnullチェック、Convert、nullable型
日付形式が固定されているParseExactTryParseExact

C#の型変換を正しく使い分けることで、例外に強く、読みやすく、保守しやすいコードを書けるようになります。