C# 泛型C的重载运算符#

C# 泛型C的重载运算符#,c#,generics,operator-overloading,function-pointers,C#,Generics,Operator Overloading,Function Pointers,我想创建一个procedure类,它支持连接到另一个类似这样的过程:a | b | c | d(这将导致一个过程采用a的输入类型,并给出d的输出类型) 类过程 { 公共职能; 公共程序(Func Func) {this.func=func;} 公共静态程序操作员|(程序proc1,程序proc2) {返回新过程((x)=>proc2.Process(proc1.Process(x));} 公共O过程(I输入) {返回函数调用(输入);} } 编译器抱怨它找不到M。通常我会在方法名之后添加,但是

我想创建一个procedure类,它支持连接到另一个类似这样的过程:a | b | c | d(这将导致一个过程采用a的输入类型,并给出d的输出类型)

类过程
{
公共职能;
公共程序(Func Func)
{this.func=func;}
公共静态程序操作员|(程序proc1,程序proc2)
{返回新过程((x)=>proc2.Process(proc1.Process(x));}
公共O过程(I输入)
{返回函数调用(输入);}
}
编译器抱怨它找不到M。通常我会在方法名之后添加,但是在这种情况下,它会被识别为运算符名的一部分。你怎么办


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

你不能这样做,因为
m
不是
Procedure
类的类型参数,你不能为
操作符定义它。
-这是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)));
    }
公共静态过程组成(过程proc1、过程proc2)
{
返回新过程((x)=>proc2.Process(proc1.Process(x));
}

重写二进制操作的规则是,两个参数中的一个必须与封闭类的类型相同。所以proc1或proc2必须是Procedure类型。这使得它无法实现您所需要的


我知道你想做什么,但用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)));
    }