如果泛型类型具有这些运算符,如何重载泛型类上的运算符?

问题描述 投票:0回答:1

假设我有一个通用矩阵类型:

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
类型一起使用。 (不过,如果在运行时检查这一点也没关系。)

也许有子类和隐式转换的东西?

c# generics operator-overloading
1个回答
0
投票

据我所知,目前这是不可能的。

最简单的解决方法是扩展方法:

static class MatrixExt{
    public static Matrix<T> Add(this Matrix<T> a, Matrix<T> b) where T: IAdditionOperators<T>{
          ...
     }
}

这需要以某种方式公开访问实际数据。

有人讨论过“扩展运算符”,但没有任何内容被添加到该语言中。

© www.soinside.com 2019 - 2024. All rights reserved.