これまでに投稿された良い答えに加えて、あなたはあなたの型を可変値型ではなく不変構造にするべきです。これはまさに、不変の値型が設計された種類の仕事です。
struct Megawatt
{
private double Value { get; private set; }
public Megawatt(double value) : this()
{
this.Value = value;
}
public static Megawatt operator +(Megawatt x, Megawatt y)
{
return new Megawatt(x.Value + y.Value);
}
public static Megawatt operator -(Megawatt x, Megawatt y)
{
return new Megawatt(x.Value - y.Value);
}
// unary minus
public static Megawatt operator -(Megawatt x)
{
return new Megawatt(-x.Value);
}
public static Megawatt operator *(Megawatt x, double y)
{
return new Megawatt(x.Value * y);
}
public static Megawatt operator *(double x, Megawatt y)
{
return new Megawatt(x * y.Value);
}
}
等々。2メガワットを合計することはできますが、2メガワットを掛けることはできないことに注意してください。メガワットに2倍しか掛けることができません。
ユニットを搭載したタイプをさらに追加することもできます。たとえば、タイプMegawattHourとタイプHourを作成し、MegawatttimesHourがMegawattHourを与えると言うことができます。別のタイプのジュールがあり、MegawattHourからジュールへの暗黙の変換があるとも言えます。
C#よりも冗長性の低いこれらの種類の操作をサポートするプログラミング言語は多数あります。この種のことをたくさん行う場合は、F#を調べるかもしれません。