如何在静态类中静态覆盖/创建operator *

时间:2013-07-25 08:35:29

标签: c# operators operator-overloading override

您好我想为Array操作编写一些扩展名,如:

MatrixProduct

public static double[][] operator *(double[][] matrixA, double[][] matrixB)

MatrixVectorProduct

public static double[] operator *(double[][] matrix, double[] vector)

还有一些

为什么我要这个?因为你可能知道目前在c#中没有实现这样的操作,如果我可以说matrixC = matrixA * matrixB; matrixC = MatrixProduct(matrixA,matrixB); public static class ArrayExtension { public static double[] operator *(double[][] matrix, double[] vector) { // result of multiplying an n x m matrix by a m x 1 column vector (yielding an n x 1 column vector) int mRows = matrix.Length; int mCols = matrix[0].Length; int vRows = vector.Length; if (mCols != vRows) throw new InvalidOperationException("Non-conformable matrix and vector in MatrixVectorProduct"); double[] result = new double[mRows]; // an n x m matrix times a m x 1 column vector is a n x 1 column vector Parallel.For(0, mRows, i => { var row = matrix[i]; for (int j = 0; j < mCols; ++j) result[i] += row[j] * vector[j]; }); return result; } } ,那么感觉更自然吗?有没有办法做到这一点?

因为如果我这样做:

{{1}}

异常告诉我,我无法组合静态类和用户定义的运算符,所以有解决方法吗?

1 个答案:

答案 0 :(得分:3)

如果其中一个操作数是用户定义的类型,则只能重载operator *,所以不幸的是答案是否定的。

来自MSDN

  

要使自定义类上的运算符重载,需要创建方法   在具有正确签名的班级上。必须命名该方法   “运算符X”,其中X是运算符的名称或符号   超载。一元运算符有一个参数和二元运算符   有两个参数。 在每种情况下,一个参数必须是相同的类型   作为声明运算符的类或结构 [...]

因此,您不得不在表达式中涉及自定义Matrix类,或使用带有double[]参数的正确方法。