是否有一些'where'类型约束可以添加以使下面的代码编译?
public class Plus<T> : BinaryOperator<T> where T : ...
{
public override T Evaluate(IContext<T> context)
{
return left.Evaluate(context) + right.Evaluate(context);
}
}
谢谢:)
答案 0 :(得分:20)
C#中没有这样的设备。但是有一些选择:
dynamic
,它支持+
但不提供编译时检查Operator
类which makes operators available as methods - 再次,没有任何编译时检查所以:
return (dynamic)left.Evaluate(context) + (dynamic)right.Evaluate(context);
或
return Operator.Add(left.Evaluate(context), right.Evaluate(context));
答案 1 :(得分:4)
C#中的Type参数约束非常有限,并且是listed here。所以答案是编译时检查没有。 如果T是您创建和管理的类型,那么可以采用的方法是
interface IAddable
{
IAddable Add(IAddable foo);
}
为所有类型实施IFoo,并使用where T: IAddable
作为约束,并使用Add()
代替+
答案 2 :(得分:1)
使用通用约束,您可以强制T
但这就是全部。你不能强迫它上面存在静态operator+
。
答案 3 :(得分:0)
答案 4 :(得分:0)
使用C# 8 default interface methods可以达到类似的目的,但可能无法解决您的确切用例:
您可以使用操作员的默认实现定义接口:
public interface IFoo
{
double Value { get; }
public static IFoo operator +(IFoo a, IFoo b)
{
return new Foo(a.Value + b.Value);
}
}
public class Foo : IFoo
{
public double Value { get; }
public Foo(double value)
{
Value = value;
}
}
并在这样的通用方法/类中使用它:
public static class Program
{
public static void Main()
{
var f1 = new Foo(1);
var f2 = new Foo(2);
var sum = Add(f1, f2);
Console.WriteLine(sum.Value);
}
public static IFoo Add<T>(T a, T b) where T : IFoo
{
return a + b;
}
}