11

使用しているドメインタイプごとにデータ型を作成することで、コードで間違ったドメインデータを使用しないようにするための便利なトリックを読みました。これを行うことにより、コンパイラーは誤ってタイプを混在させることを防ぎます。

たとえば、次のように定義します。

public struct Meter
{
    public int Value;

    public Meter(int value)
    {
        this.Value = value;
    }
}

public struct Second
{
    public int Value;

    public Second(int value)
    {
        this.Value = value;
    }
}

メーターと秒は別々のデータ型であるため、それらを混同しないようにすることができます。これは素晴らしいことであり、私はそれがどれほど役立つかを見ることができます。これらの型であらゆる種類の算術演算を処理するには、演算子のオーバーロードを定義する必要があることは承知していますが、簡単にするために省略しています。

このアプローチで私が抱えている問題は、これらの型を使用するために、次のように毎回完全なコンストラクターを使用する必要があることです。

Meter distance = new Meter(5);

System.Int32C#には、次のように、が使用するのと同じ構築モードを使用できる方法はありますか?

Meter distance = 5;

暗黙の変換を作成しようとしましたが、これはカスタムタイプではなく、Int32タイプの一部である必要があるようです。静的である必要があるため、Int32に拡張メソッドを追加できません。これを行う方法はありますか?

4

1 に答える 1

24

構造体自体で直接暗黙の変換を指定できます。

public struct Meter
{
    public int Value;

    public Meter(int value)
    {
        this.Value = value;
    }

    public static implicit operator Meter(int a)
    {
         return new Meter(a);
    }
}

public struct Second
{
    public int Value;

    public Second(int value)
    {
        this.Value = value;
    }

    public static implicit operator Second(int a)
    {
         return new Second(a);
    }
}
于 2012-07-01T00:55:49.147 に答える