web-dev-qa-db-ja.com

C#での割り当て演算子のオーバーロード

=演算子はオーバーロードできませんが、ここで必要なことを行う方法が必要です。

私は物理学を少しやっているので、量的単位を表すクラスを作成しています。どうやらプリミティブから継承することはできないようですが、クラスがプリミティブとまったく同じように動作するようにしたいと考えています。

だから私は行くことができるだろう、

Velocity ms = 0;
ms = 17.4;
ms += 9.8;

等.

これを行う方法がわかりません。私はちょうどそのようにいくつかのクラスを書くと思った:

class Power
{
    private Double Value { get; set; }

    //operator overloads for +, -, /, *, =, etc
}

しかし、どうやら代入演算子をオーバーロードすることはできません。この動作を取得する方法はありますか?

57
Carson Myers

クラスではなくstructを使用してから、暗黙的な変換演算子と追加などのさまざまな演算子を作成する必要があるようです。

次にサンプルコードを示します。

public struct Velocity
{
    private readonly double value;

    public Velocity(double value)
    {
        this.value = value;
    }

    public static implicit operator Velocity(double value)
    {
        return new Velocity(value);
    }

    public static Velocity operator +(Velocity first, Velocity second)
    {
        return new Velocity(first.value + second.value);
    }

    public static Velocity operator -(Velocity first, Velocity second)
    {
        return new Velocity(first.value - second.value);
    }

    // TODO: Overload == and !=, implement IEquatable<T>, override
    // Equals(object), GetHashCode and ToStrin
}

class Test
{
    static void Main()
    {
        Velocity ms = 0;
        ms = 17.4;
        // The statement below will perform a conversion of 9.8 to Velocity,
        // then call +(Velocity, Velocity)
        ms += 9.8;
    }
}

(補足として...私はこれが実際に速度をどのように表すかわかりません、確かに方向と大きさが必要です。)

87
Jon Skeet

暗黙的な変換演算子を作成できます。 MSDNのページ の例があります。

また、それらを不変の構造体にすることをお勧めします。それがまさに「プリミティブ」であり、それがそれらからの継承を不可能にしているのです。参照型のセマンティクスではなく、値型のセマンティクスが必要なため、構造体が必要です。可変値型は一般に 悪い考え であるため、不変にしたい

10