2

我需要的是在 C# 中重载 Operator +,这样我就可以对 2 个矩阵求和。

我拥有的是这个功能:

public int[,] operator+(int[,] matriz1, int[,] matriz2)
    {
        int[,] retorno = new int[4, 4];
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                retorno[i, j] = matriz1[i, j] + matriz2[i, j];
            }
        }
        return retorno;
    }

例如,当我这样做时(WT,W1,W2 都是 int[4,4]):

WT = W1 + W2;

我收到一条错误消息:运算符 + 不能应用于 int[ , ] 和 int[ , ] 类型的操作数,我做错了什么,我该如何解决?

4

3 回答 3

6

好吧,首先,在您尝试使用运算符之前,请尝试仅编译运算符方法。它不会编译,并且错误消息告诉:

错误 CS0563:二元运算符的参数之一必须是包含类型

这正是它所说的:如果你写一个 class ,你可以为(or )C写一个加法运算符。您不能定义不以某种方式涉及的运算符。所以,简单地说,因为你不是编写这个类的人,你不能为它定义一个操作符。C + <any type><any type> + CCint[,]

你最好的选择可能是Matrix自己定义一个类,然后你可以定义你想要的任何运算符。例如;

public class Matrix
{
    private readonly int[,] _values;

    public int this[int x, int y] {
        get { return _values[x, y]; }
    }

    public Matrix(int[,] values) {
        _values = values;
    }

    public static Matrix operator +(Matrix x, Matrix y) {
        int[,] m0 = x._values;
        int[,] m1 = y._values;
        int[,] newMatrix = /* add m0 and m1 */;
        return new Matrix(newMatrix);
    }
}
于 2013-04-12T01:17:45.800 回答
3

您不能为非自定义类型编写运算符:

运算符重载允许为其中一个或两个操作数是用户定义的类或结构类型的操作指定用户定义的运算符实现。

资料来源:MSDN

另一种方法可能是编写扩展方法:

public static class MatrixExtensions {
    public static  int[,] Add(this int[,] matriz1, int[,] matriz2)
    {
        int[,] retorno = new int[4, 4];
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                retorno[i, j] = matriz1[i, j] + matriz2[i, j];
            }
        }
        return retorno;
    }
}

并像这样使用它:

int[,] a = ...
int[,] b = ...
int[,] c = a.Add(b);
于 2013-04-12T01:14:27.000 回答
3

在这种情况下它不起作用,因为必须为其工作的类完成运算符重载,在这种情况下,您只需为该方法包含的任何类重载它。基本上,当您执行 W1 + W2 时,它会查找为 定义的“+”运算符int[,],该内置类型不存在该运算符。

要让它像您尝试做的那样在矩阵上工作,您需要创建一个Matrix类(可能在内部将其值存储为二维整数数组),然后重载该类的运算符。

于 2013-04-12T01:15:32.457 回答