是否可以将通用约束与运算符重载结合起来?

Is possible to combine Generic Constraint with operator overloading?

我想知道是否可以使用通用约束(何时)允许此代码?

这样做的正确模式是什么?

public MyClass<T>
{
    public void MyMethod(T a, T b) 
    {
       //some code
       var result = a<b;
      //some code 
    }
}

我的问题一般是针对所有运营商的

+, -, !, ~, ++, --, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=

这实际上与模式匹配无关。 where(不是 when)在这种情况下表示 generic constraints。 不,不可能对操作员施加约束。

您可能想改用自定义界面,在其上添加约束。

public class MyClass<T> where T: ICustomInterface

IComparable> 运算符的一个很好的候选者,但就您希望运算符重载而言,它不适合。

顺便说一句,F# 允许您拥有这样的约束 — 它称为 Member constraints — with use of Statically resolved type parameters。它允许您在任何类型成员或运算符上添加约束。但这不是 CLR 的特性,这可能只是因为丰富的类型推理系统。

此时(2018 年 5 月),您唯一能做的就是在 class 定义中添加对 IComparable<T> 的约束,并使用 CompareTo 方法代替<

public class MyClass<T> where T : IComparable<T>
{
    public void MyMethod(T a, T b) 
    {
       //some code
       var result = a.CompareTo(b) < 0; // a < b
       //some code 
    }
}

这将涵盖 <<=>>=(技术上甚至是 ==,但最好使用 IEquatable<T>),对于 ==,您可以将 IEquatable<T> 的约束添加到 class 定义,并使用 Equals 方法而不是 ==(并且!Equals 而不是 !=)。

对于 math/bitwise 运营商而言,目前没有希望。在 C# 愿望清单中总是有对此功能的请求,但它们总是被推迟。在 C# 8.0 中,此功能将不存在(可能)。有关此问题的旧问题,请参阅 official list of candidates. See Generic C# Code and the Plus Operator。请注意,如果您尝试使用不存在的运算符,给出的解决方案不会在编译时给出错误,但会在运行时给出这些错误。