独自型変換演算子の概要
C#では、class・structに対して独自の型変換ルールを定義できる。
これにより、ビルトイン型と同じような自然な代入・キャストが可能になる。
変換の種類
- 暗黙変換(implicit):代入時に自動で実行される。データ損失が発生しないことが前提。
- 明示変換(explicit):キャスト構文(
(型)値)が必須。精度の低下や例外のリスクを明示する。
暗黙変換の実装
public static implicit operator 変換先型(変換元型 パラメータ名)
{
// 変換ロジック
return 変換先の値;
}
実装例:閾値付き整数
public sealed class ClampedValue
{
private const int UpperLimit = 100;
private const int LowerLimit = 0;
private int _raw;
public int Value
{
get => _raw;
private set => _raw = Math.Clamp(value, LowerLimit, UpperLimit);
}
public ClampedValue(int value) => Value = value;
// int → ClampedValue(暗黙)
public static implicit operator ClampedValue(int v) => new ClampedValue(v);
// ClampedValue → int(暗黙)
public static implicit operator int(ClampedValue c) => c.Value;
}
使用例
ClampedValue cv = 123; // 暗黙変換:123 → 100(上限クリップ)
int n = cv; // 暗黙変換:100
Console.WriteLine($"{cv.Value}, {n}"); // 100 100
明示変換の実装
public static explicit operator 変換先型(変換元型 パラメータ名)
{
// 変換ロジック
return 変換先の値;
}
実装例:同じ型に明示変換を適用
public sealed class ClampedValueExplicit
{
private const int UpperLimit = 100;
private const int LowerLimit = 0;
private int _raw;
public int Value
{
get => _raw;
private set => _raw = Math.Clamp(value, LowerLimit, UpperLimit);
}
public ClampedValueExplicit(int value) => Value = value;
// int → ClampedValueExplicit(明示)
public static explicit operator ClampedValueExplicit(int v) => new ClampedValueExplicit(v);
// ClampedValueExplicit → int(明示)
public static explicit operator int(ClampedValueExplicit c) => c.Value;
}
使用例
ClampedValueExplicit cve = (ClampedValueExplicit)123; // 明示キャスト
int m = (int)cve; // 明示キャスト
Console.WriteLine($"{cve.Value}, {m}"); // 100 100
補足:型チェック・安全キャスト演算子
独自変換とは別に、is・as演算子を使えば実行時の型安全性を保ちながらキャストできる。