【问题标题】:Overloading operator for generics C# [duplicate]泛型C#的重载运算符[重复]
【发布时间】:2015-05-23 09:22:16
【问题描述】:

我想创建一个支持连接到另一个过程的过程类,如下所示:a|b|c|d(这应该导致过程采用 a 的输入类型,并给出 d 的输出类型)

class Procedure<I,O>
{
  public Func<I,O> func;
  public Procedure(Func<I, O> func)
  { this.func = func; }
  public static Procedure<I, O> operator| (Procedure<I, M> proc1, Procedure<M, O> proc2)
  { return new Procedure<I,O>((x) => proc2.Process(proc1.Process(x))); }
  public O Process(I input)
  { return func.Invoke(input); }
}

编译器抱怨它找不到 M。通常我会在方法名称之后添加,但是在这种情况下,它会被识别为操作符名称的一部分。做什么?

顺便说一句,我正在尝试将我的 Scala 库移动到 C# 中。

【问题讨论】:

    标签: c# generics operator-overloading function-pointers


    【解决方案1】:

    你不能这样做,因为M 不是Procedure 类的类型参数,你不能为operator | 定义它——这是C# 的限制。 要解决这个问题,请使用方法,而不是运算符:

    public static Procedure<I, O> Composition<M>(Procedure<I, M> proc1, Procedure<M, O> proc2)
        {
            return new Procedure<I, O>((x) => proc2.Process(proc1.Process(x)));
        }
    

    【讨论】:

    • 我实际上说我在问题中知道这一点。它更多的是询问如何使用运算符。不过谢谢!
    • 我错过了你提到的,对不起
    【解决方案2】:

    重写二元运算的规则是两个参数之一必须与封闭类的类型相同。因此,proc1 或 proc2 必须是 Procedure 类型。这使其无法满足您的需求。

    我可以看到您要执行的操作,但无法在 C# 中完成。编译器将为从唯一的泛型参数生成的每个类仅生成一个运算符覆盖实现。在您的情况下,您需要编译器自动泛型处理所有使用的中间类型。

    【讨论】:

    • 感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2017-04-28
    • 2010-10-19
    • 2014-01-01
    • 1970-01-01
    • 2023-03-24
    • 2017-06-07
    相关资源
    最近更新 更多