假设我有一个通用矩阵类型:
class Matrix<T>
{
private T[,] _data;
}
是否可以在
+
上重载 Matrix<T>
运算符 当且仅当 T
具有重载的 +
运算符?
最近写了很多 Rust,我希望这能起作用:
class Matrix<T>
{
private T[,] _data;
public static Matrix<T> operator+(Matrix<T> lhs, Matrix<T> rhs)
where T: IAdditionOperators<T>
{
// ...
}
}
遗憾的是,
where
只能应用于方法本身的泛型参数,而不能应用于其包含类的泛型参数。
我知道我可以删除
where
子句并在方法主体中使用 dynamic
来执行加法,但 性能影响 在我的情况下是不可接受的。
这个问题类似,但可以使用 C# 11 中新的
IAdditionOperator<T>
接口来解决。但是,我希望我的 Matrix<T>
类型能够与也没有加法运算符的 T
类型一起使用。 (不过,如果在运行时检查这一点也没关系。)
也许有子类和隐式转换的东西?
据我所知,目前这是不可能的。
最简单的解决方法是扩展方法:
static class MatrixExt{
public static Matrix<T> Add(this Matrix<T> a, Matrix<T> b) where T: IAdditionOperators<T>{
...
}
}
这需要以某种方式公开访问实际数据。
有人讨论过“扩展运算符”,但没有任何内容被添加到该语言中。