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#中没有这样的设备.但是有一些选择:
dynamic,它支持+但不提供编译时检查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)
C# 中的 Type 参数约束非常有限,在此处列出。因此,就编译时检查而言,答案是否定的。如果 T 是您创建和管理的类型,那么实现它的一种方法是
interface IAddable
{
IAddable Add(IAddable foo);
}
Run Code Online (Sandbox Code Playgroud)
并为所有类型实现 IFoo 并where T: IAddable用作约束并使用Add()而不是+
| 归档时间: |
|
| 查看次数: |
8496 次 |
| 最近记录: |