矩阵重载算子c#

矩阵重载算子c#,c#,matrix,operators,overloading,C#,Matrix,Operators,Overloading,我需要的是在C#中重载运算符+,这样我可以对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++) {

我需要的是在C#中重载运算符+,这样我可以对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;
    }
我得到一个错误,说:
运算符+不能应用于int[,]和int[,]类型的操作数,我做错了什么,如何解决它?

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

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

资料来源:

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

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;
    }
}

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


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

首先,在您尝试使用运算符之前,请尝试只编译运算符方法。它将无法编译,错误消息显示:

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

这正是它的意思:如果您编写一个类
C
,您可以为
C+
(或
+C
)编写一个加法运算符。您不能定义不以某种方式涉及
C
的运算符。因此,很简单,因为您不是编写
int[,]
类的人,所以您不能为它定义运算符

最好的办法可能是自己定义一个
矩阵
类,然后可以在上面定义任何运算符。比如,

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);
    }
}

是的,Fls的禅是正确的-这是一个副本,有正确的答案谢谢!我不知道。我不相信这个解决方案。这并不是覆盖操作符,您只是实现了一个方法。使用A.Add(B)的语法和A+B的语法是不一样的。首先,从一开始,您的队友就不清楚Add是将B添加到A并更改A,还是只计算值。您的队友也不清楚Add是返回矩阵还是返回空值。他们必须看看你的方法。另一方面,如果他们在代码中看到A+B,他们就会明白。@LajosArpad我知道我只是在编一个新方法……我明确地说。您不能在
int[,]
中使用运算符,因此如果您想要类似的东西,必须编写自己的类,我认为这一点已经不清楚了。您不知道它是否返回
void
?看那该死的方法签名,没必要粗鲁。首先,如果可以编写更好的代码,我不想阅读方法签名。我想看A+B而不是A.Add(B)。就这么简单。还有,也许我对你不够清楚。我会说得更清楚,这样你就会明白。。。op已经讨论了矩阵和运算符覆盖。这意味着他应该创建一个名为Matrix的类,并覆盖+运算符。如果你不把所有的精力都用在粗鲁上的话,你可能从我的第一句话就已经理解了。我不是有意粗鲁的,所以我们也不要讽刺了。我第一次确实理解了,这是别人的建议。还请注意,问题是“为什么不”,所以我回答“因为”。我只是提出一个替代方案。赞成的是它使用内置类型,反对的是(可能)它的行为在没有intellisense/文档的情况下不够清晰。使用操作符的优点是它的行为是(应该是?)隐式的,但缺点是当有内置类型时,您正在创建一个全新的类来使用矩阵。所以,自定义整个类与方法。谢谢,我会试试的。
int[,] a = ...
int[,] b = ...
int[,] c = a.Add(b);
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);
    }
}