除了到目前为止发布的好答案之外:您应该使您的类型成为不可变结构而不是可变值类型。这正是不可变值类型的设计目的。
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 兆瓦相乘;你只能将兆瓦乘以两倍。
您还可以添加更多包含单元的类型。例如,您可以创建一个 MegawattHour 类型和一个 Hour 类型,然后说 Megawatt 乘以 Hour 等于 MegawattHour。您也可以说存在另一种焦耳类型,并且存在从兆瓦时到焦耳的隐式转换。
有许多编程语言支持这些类型的操作,而且比 C# 更简洁;如果你做了很多这类事情,你可能会研究 F#。