泛型 C# 的重载运算符
Overloading operator for generics C#
我想创建一个支持连接到另一个过程的过程 class: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# 中。
你不能这样做,因为 M
不是 Procedure
class 的类型参数,你不能为 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)));
}
覆盖二元运算的规则是两个参数之一必须与封闭的 class 的类型相同。所以 proc1 或 proc2 必须是 Procedure 类型。这使它无法实现您的需求。
我知道你在做什么,但不能在 C# 中完成。编译器将为每个从唯一通用参数生成的 class 生成一个运算符覆盖实现。在您的情况下,您需要编译器自动生成尽可能多的泛型来处理所有使用的中间类型。
我想创建一个支持连接到另一个过程的过程 class: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# 中。
你不能这样做,因为 M
不是 Procedure
class 的类型参数,你不能为 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)));
}
覆盖二元运算的规则是两个参数之一必须与封闭的 class 的类型相同。所以 proc1 或 proc2 必须是 Procedure 类型。这使它无法实现您的需求。
我知道你在做什么,但不能在 C# 中完成。编译器将为每个从唯一通用参数生成的 class 生成一个运算符覆盖实现。在您的情况下,您需要编译器自动生成尽可能多的泛型来处理所有使用的中间类型。