是否存在可用于+运算符的通用约束?

VAN*_*han 27 c# generics constraints

是否有一些"where"类型的约束可以添加以使下面的代码编译?

public class Plus<T> : BinaryOperator<T> where T : ...
{
    public override T Evaluate(IContext<T> context)
    {
        return left.Evaluate(context) + right.Evaluate(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

Mar*_*ell 20

C#中没有这样的设备.但是有一些选择:

  • 在C#4.0和.NET 4.0(或更高版本)中,使用dynamic,它支持+但不提供编译时检查
  • 在.NET 3.5(或更高版本)中,MiscUtil提供了一个Operator,它使运算符可用作方法 - 再次,没有任何编译时检查

所以要么:

return (dynamic)left.Evaluate(context) + (dynamic)right.Evaluate(context);
Run Code Online (Sandbox Code Playgroud)

要么

return Operator.Add(left.Evaluate(context), right.Evaluate(context));
Run Code Online (Sandbox Code Playgroud)


小智 8

在 C# 11 和 .NET 7 中,有一个专门用于此目的的功能(请参阅Microsoft Docs)。它必须如下所示:

public interface IAddable<T> where T : IAddable<T>
{
    static abstract T operator +(T left, T right);
}

public class Foo : IAddable<Foo>
{
    public static Foo operator +(Foo left, Foo right)
    {
        /* Something */
    }
}
Run Code Online (Sandbox Code Playgroud)


Bal*_*a R 5

C# 中的 Type 参数约束非常有限,在此处列出。因此,就编译时检查而言,答案是否定的。如果 T 是您创建和管理的类型,那么实现它的一种方法是

interface IAddable 
{
   IAddable Add(IAddable foo);
}
Run Code Online (Sandbox Code Playgroud)

并为所有类型实现 IFoo 并where T: IAddable用作约束并使用Add()而不是+