假设我有一个泛型矩阵类型:

class Matrix<T>
{
    private T[,] _data;
}

可以重载Matrix<T> if and only if上的+运算符T具有重载的+运算符吗?

最近我写了很多《铁 rust 》,我希望这能奏效:

class Matrix<T>
{
    private T[,] _data;

    public static Matrix<T> operator+(Matrix<T> lhs, Matrix<T> rhs)
        where T: IAdditionOperators<T>
    {
        // ...
    }
}

遗憾的是,where只能应用于方法本身的泛型参数,而不能应用于其包含类的泛型参数.

我知道我可以go 掉where子句,在方法体中使用dynamic来执行加法,但在我的例子中,performance implications是不能接受的.

This question类似,但可以用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>{
          ...
     }
}

这将要求实际数据以某种方式向公众开放.

有关于"扩展运算符"的讨论,但没有任何东西被添加到语言中.

Csharp相关问答推荐

EF Core:看不到任何查询日志(log)?

有没有一种方法可以防止在编译时在MicrosoftC或非单线程上下文中调用方法?

C++/C#HostFXR通过std::tuple传递参数

如何在C#中将对象[*,*]直接转换为字符串[*,*]?

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

在路由中使用枚举

当索引和外键是不同的数据类型时,如何设置导航属性?

在C#中,非静态接口方法的抽象和虚拟是冗余的吗?

TagHelpers在新区域不起作用

为什么@rendermode Interactive Auto不能在.NET 8.0 Blazor中运行?

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

try 链接被委派者(多播委托)时,无法将获取运算符应用于类型为';方法组&39;和方法组';的操作数

如何允许数组接受多个类型?

为什么Docker中没有转发该端口?

使用CollectionView时在.NET Maui中显示数据时出现问题

.Net MAUI,在将FlyoutPage添加到容器之前,必须设置添加构造函数导致Flyout和Detail"

CRL已过期,但ChainStatus告诉我RevocationStatus未知

为什么我的UserControl没有加载到我的主窗口中?

如何在C#Visual Studio IF语句中删除换行符