在我看来,这不仅仅是我的问题。
请不要将我的问题作为副本关闭,因为我查看了这些问题并且找不到解决方案。
class Matrix<T> {
private Int32 rows;
private Int32 cols;
private T[,] matrix;
public Matrix() {
rows = cols = 0;
matrix = null;
}
public Matrix(Int32 m, Int32 n) {
rows = m;
cols = n;
matrix = new T[m, n];
}
public T this[Int32 i, Int32 j] {
get {
if (i < rows && j < cols)
return matrix[i, j];
else
throw new ArgumentOutOfRangeException();
}
protected set {
if (i < rows && j < cols)
matrix[i, j] = value;
else
throw new ArgumentOutOfRangeException();
}
}
public Int32 Rows {
get { return rows; }
}
public Int32 Cols {
get { return cols; }
}
public static Matrix<T> operator+(Matrix<T> a, Matrix<T> b) {
if(a.cols == b.cols && a.rows == b.rows) {
Matrix<T> result = new Matrix<T>(a.rows, a.cols);
for (Int32 i = 0; i < result.rows; ++i)
for (Int32 j = 0; j < result.cols; ++j)
result[i, j] = a[i, j] + b[i, j];
return result;
}
else
throw new ArgumentException("Matrixes don`t match operator+ requirements!");
}
public static Matrix<T> operator-(Matrix<T> a, Matrix<T> b) {
if (a.cols == b.cols && a.rows == b.rows) {
Matrix<T> result = new Matrix<T>(a.rows, a.cols);
for (Int32 i = 0; i < result.rows; ++i)
for (Int32 j = 0; j < result.cols; ++j)
result[i, j] = a[i, j] - b[i, j];
return result;
}
else
throw new ArgumentException("Matrixes don`t match operator- requirements!");
}
你知道编译器说的是什么:“运算符' - '不能应用于'T'和'T'类型的操作数,这适用于所有运算符。
那么,对此最好的决定是什么?据我所知,接口不能包含运算符,所以唯一的方法是类型T的抽象基类。但是,正如我发现的那样,operatoes不能被定义为抽象。
答案 0 :(得分:3)
之前的答案(已经链接)解释了大部分内容;相关示例(在.NET 3.5中使用MiscUtil) - Complex<T>
答案 1 :(得分:2)
答案 2 :(得分:0)
您可以重载运算符,但编译器无法知道如何添加两个未知泛型类型(T + T),并且您无法添加约束,因为运算符是静态成员。
一种方法(在.Net 2.0中 [Edit] )将在Matrix的静态构造函数中为所有运算符方法创建一个工厂,这样可以创建一个正确的实现值类型T(例如,基于其TypeCode),或者为不支持的值类型抛出NotImplementedException
。但是这样,你没有编译时检查。
[编辑] 在.Net 3.5中,您实际上可以使用表达式树来获取通用参数的运算符:https://jonskeet.uk/csharp/miscutil/usage/genericoperators.html。
您也可以查看此链接:http://msdn.microsoft.com/en-us/library/system.linq.expressions.binaryexpression.aspx