我定义了以下结构类型及其相应的数学运算符
public struct FXRate {....}
public struct Money
{
...
public static Money operator * (Money money, FXRate rate){....}
...
}
这样,我就可以执行如下所示的强类型数学运算
Money m = new Money(...)
FXRate r = new FXRate(...)
var a = m * r;
效果很好。
我的问题是
我可以定义所有这些运算符,但是由于大量不同类型的组合,因此重复太多了。当添加更多类型和运算符时,问题可能会变得更加严重。下面是我想用尽可能少的代码重复做的示例]
Money m = new Money(...)
FXRate r = new FXRate(...)
var a = m * r; // already available
Money? nullm = null;
FXRate? nullr = null;
// how to enable the following operations with as little code duplication as possible
var b = r * m;
var c = nullm * r;
c = nullm * nullr;
c = nullr * m;
c = nullr * nullm
...
没有办法。但是,您可以做一些怪癖:
如果您定义运算符的可空版本,则可以免费获得不可空的版本。也就是说,显然可以用不可为空的public static S operator +(S? a, S? b)
来调用S
(因为there's an implicit conversion between System.Nullable<T>
and T
)。
假设您使用不同的类型意味着不同的度量单位,或者可以在它们之间进行转换的任何地方,您都可以选择“基本度量单位”,仅定义所有运算符(System.Nullable<T>
,T
等)为此,然后定义从每种类型到基类的隐式转换(不是基类,基本度量单位)。