为可空结构实现运算符[duplicate]

问题描述 投票:2回答:1

我定义了以下结构类型及其相应的数学运算符

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;

效果很好。

我的问题是

  1. 我如何为nullable定义相应的运算符我的结构类型的版本?
  2. 如何定义相同运算符的可交换版本?
  3. 如何在C#中完成?

我可以定义所有这些运算符,但是由于大量不同类型的组合,因此重复太多了。当添加更多类型和运算符时,问题可能会变得更加严重。下面是我想用尽可能少的代码重复做的示例]

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 
...

c# types monads nullable
1个回答
-1
投票

没有办法。但是,您可以做一些怪癖:

  1. 如果您定义运算符的可空版本,则可以免费获得不可空的版本。也就是说,显然可以用不可为空的public static S operator +(S? a, S? b)来调用S(因为there's an implicit conversion between System.Nullable<T> and T)。

  2. 假设您使用不同的类型意味着不同的度量单位,或者可以在它们之间进行转换的任何地方,您都可以选择“基本度量单位”,仅定义所有运算符(System.Nullable<T>T等)为此,然后定义从每种类型到基类的隐式转换(不是基类,基本度量单位)。

© www.soinside.com 2019 - 2024. All rights reserved.