Oprócz dobrych odpowiedzi opublikowanych do tej pory: należy dokonać typ niezmienna struct zamiast typu wartości zmienny. Jest to dokładnie taka praca, do której zostały zaprojektowane niezmienne typy wartości.
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);
}
}
I tak dalej. Zauważ, że możesz dodać dwa megawaty, ale nie możesz pomnożyć dwóch megawatów; możesz tylko mnożyć megawaty przez duble.
Można również dodać więcej typów obciążonych jednostkami. Na przykład możesz utworzyć MegawattHour typu i godzinę typu, a następnie powiedzieć, że Megawatt razy Godzina daje MegawattHour. Można również powiedzieć, że istnieje inny typ Joule i istnieje niejawne przejście z MegawattHour do Joule.
Istnieje wiele języków programowania, które obsługują tego rodzaju operacje z mniejszą ilością gadżetów niż C#; jeśli robisz dużo tego typu rzeczy, możesz zajrzeć do F #.
Zobacz także http://stackoverflow.com/questions/348853/jednostki-zakresu-in-c-sharp-almost –
Powinieneś użyć operatora Przeciążenie –