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);
}
}
我的类型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);
}
}