【问题标题】:Is possible to combine Generic Constraint with operator overloading?可以将通用约束与运算符重载结合起来吗?
【发布时间】:2018-05-20 10:00:55
【问题描述】:

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

什么是正确的模式?

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

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

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

【问题讨论】:

  • 您是在谈论提议的 C# 8.0 递归模式匹配还是什么?
  • 我对 C# 和递归模式匹配一​​无所知,我使用的是 C# 7.2。但我没有在我的版本中指定 C# 版本,因为我并不关心这个。
  • @xanatos,我想问题是我们是否可以将T 转换为“定义了&lt; 运算符的类型”。
  • @TetyanaKorogoda 我只想在方法中指定 T 具有
  • @ChristopheDebove 在这个时间点(2018 年 5 月),您唯一能做的就是在类定义中添加约束 : IComparable&lt;T&gt; 并使用 CompareTo 方法而不是 &lt;

标签: c# generics operator-overloading generic-constraints


【解决方案1】:

此时(2018 年 5 月),您唯一能做的就是在类定义中添加对 IComparable&lt;T&gt; 的约束,并使用 CompareTo 方法而不是 &lt;

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

这将涵盖&lt;&lt;=&gt;&gt;=(技术上甚至是==,但最好使用IEquatable&lt;T&gt;),对于==,您可以添加一个将IEquatable&lt;T&gt; 约束到类定义并使用Equals 方法而不是==(和!Equals 而不是!=)。

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

【讨论】:

    【解决方案2】:

    这实际上与模式匹配无关。 where(不是when)在这种情况下表示generic constraints。 不,不可能对运算符进行约束。

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

    public class MyClass<T> where T: ICustomInterface
    

    IComparable&gt; 运算符的理想选择,但它不适合您希望运算符重载。

    顺便说一句,F# 允许你有这样一个约束——它被称为Member constraints——使用Statically resolved type parameters。它允许您对任何类型成员或运算符添加约束。但这不是 CLR 的特性,只是因为丰富的类型推断系统才有可能。

    【讨论】:

    • 好的,我将通用约束与匹配我不好的模式混合在一起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多