gpt4 book ai didi

c# - 如何使二进制乘法运算符 * 在泛型类中可用?

转载 作者:行者123 更新时间:2023-11-30 13:31:54 25 4
gpt4 key购买 nike

abstract class Shape<T>
{
public abstract T Area();
}
class Square<T> : Shape<T>
{
T side;
public Square(T side)
{
this.side = side;
}

public override T Area()
{
return this.side * this.side;
}
}

Error 1 Operator '*' cannot be applied to operands of type 'T' and of type 'T'.

编译器抛出错误,因为 this.side*this.side 没有 *。如何使二进制乘法运算符 * 在泛型类中可用?

最佳答案

您不能使用 * 运算符本身,但您可以通过生成一个使用此运算符的表达式来解决它:

static class Operators
{
public static T Multiply<T>(T x, T y)
{
return OperatorCache<T>.Multiply(x, y);
}

static class OperatorCache<T>
{
static OperatorCache()
{
Multiply = MakeBinaryOperator(ExpressionType.Multiply);
}

static Func<T, T, T> MakeBinaryOperator(ExpressionType type)
{
var x = Expression.Parameter(typeof(T), "x");
var y = Expression.Parameter(typeof(T), "y");
var body = Expression.MakeBinary(type, x, y);
var expr = Expression.Lambda<Func<T, T, T>>(body, x, y);
return expr.Compile();
}

public readonly static Func<T, T, T> Multiply;


}
}

然后你可以像这样使用它:

public override T Area()
{
return Operators.Multiply(this.side, this.side);
}

当然你可以在Operators类中添加其他操作符;请记住,如果您使用的运算符不是为 T 定义的,它将在运行时失败

关于c# - 如何使二进制乘法运算符 * 在泛型类中可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17565049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com