Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#已知类型上的泛型重写方法或在T上操作_C#_Generics - Fatal编程技术网

C#已知类型上的泛型重写方法或在T上操作

C#已知类型上的泛型重写方法或在T上操作,c#,generics,C#,Generics,我正在使用泛型实现一个矩阵类,以便能够创建不同类型的对象,如: Matrix<double> A = new Matrix<double>(10,20); Matrix<int> B = new Matrix<int>(10,20); Matrix<Complex> C = new Matrix<Complex>(14,25); 矩阵A=新矩阵(10,20); 矩阵B=新矩阵(10,20); 矩阵C=新矩阵(14,2

我正在使用泛型实现一个矩阵类,以便能够创建不同类型的对象,如:

 Matrix<double> A = new Matrix<double>(10,20);
 Matrix<int> B = new Matrix<int>(10,20);
 Matrix<Complex> C = new Matrix<Complex>(14,25);
矩阵A=新矩阵(10,20);
矩阵B=新矩阵(10,20);
矩阵C=新矩阵(14,25);
基本课程计划如下:

public class Matrix<T> : IFormattable, IEquatable<T>, IComparable 
  where T : struct, IEquatable<T>, IFormattable
{
    T[] _data { get; set; }

    public int columns;

    public int rows;

    // ...
}
公共类矩阵:IFormattable、IEquatable、IComparable
其中T:struct,IEquatable,IFormattable
{
T[]_数据{get;set;}
公共int列;
公共int行;
// ...
}
由于我已经实现了上述对象的泛型类以及用于解析或迭代对象的构造函数和基本方法,所以一切都很好

此时,我正在尝试对上述通用矩阵对象实现基本的算术运算。从求和过程开始,我面临的问题是,我不能在T对象中实现加法(矩阵的基础是T[]对象)。因此,当我在索引两个T对象时求和时,似乎给了我一个无法克服的预期错误。作为示例,我希望以下代码对两个矩阵的元素求和:

for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < columns; j++)
    {
        //Operator '+' cannot be applied to operands of type 'T' and 'T'
        C[i, j] = B[i,j] + this[i, j]; 
    }
}
for(int i=0;i
我试图用在互联网上找到的几种解决方案来解决上述问题,但没有找到解决方案

有什么有效的解决办法吗?在T类型为double或int等的情况下为调用创建方法? 任何帮助都将不胜感激。
提前谢谢

您必须为每个类型添加逻辑,即检查它是否为int或double等已知类型,然后通过强制转换进行计算。更好的方法可能是创建一个专门的继承类(例如,
类IntMatrix:Matrix
)并在那里实现逻辑。这可能也会有所帮助:我认为最方便的解决方案是为每个操作符构建回调。您可以将每个字段存储在
矩阵
类中的
静态只读
字段中,因为静态字段的作用域是特定的泛型实例化。这样,每个类型只需构建一次回调
T
@MikeStrobel,这是链接的复制之一