C# 为泛型 class 或结构的具体类型创建运算符重载

C# create operator overload for concrete type of generic class or struct

我的类型CRange<T>定义为

public readonly struct CRange<T>
  where T : struct, IComparable
{
  ...

  public T LowerValue { get; }
  public T UpperValue { get; }
}

很遗憾,没有where T: Number

我主要使用 CRange<int>CRange<double>,在一些情况下我想将 CRange<> 乘以一个因数 (= double)。

我试过了

public static CRange<double> operator * (CRange<double> i_range, double i_factor)

但这是不允许的,因为每个运算符必须至少包含一个该类型的操作数。

还有其他方法可以创建这样的运算符吗?

您可以编写一个扩展方法——这就是运行时所做的,例如Vector128<T>。但是,这确实意味着您需要一种方法而不是运算符。

public static class CRangeExtensions
{
    public static CRange<double> Multiply(this CRange<double> range, double factor)
    {
        return new CRange(range.LowerBound * factor, range.UpperBound * factor);
    }

    // Same for int...
}

如果您可以使用预览功能,则可以使用定义 INumber<T> 接口的 Generic math

public readonly struct CRange<T> where T : INumber<T>
{
    public T LowerValue { get; }
    public T UpperValue { get; }
    
    public CRange(T lower, T upper) => (LowerValue, UpperValue) = (lower, upper);
  
    public static CRange<T> operator * (CRange<T> range, T factor)
    {
        return new CRange<T>(range.LowerValue * factor, range.UpperValue * factor);
    }
}

SharpLab.