泛型C#的重载运算符

Zuoanqh

我想创建一个过程类来支持连接到另一个过程,例如: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#中。

菲尔·赖特

覆盖二进制操作的规则是,两个参数之一必须与封闭类具有相同的类型。因此proc1或proc2必须是Procedure <I,O>类型。这使得它无法实现您所需要的。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章