C#における独自型の暗黙・明示変換実装ガイド

独自型変換演算子の概要

C#では、classstructに対して独自の型変換ルールを定義できる。
これにより、ビルトイン型と同じような自然な代入・キャストが可能になる。

変換の種類

  • 暗黙変換(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

補足:型チェック・安全キャスト演算子

独自変換とは別に、isas演算子を使えば実行時の型安全性を保ちながらキャストできる。

タグ: C# operator-overloading implicit-conversion explicit-conversion type-casting

7月19日 02:05 投稿