【问题标题】:matrix overload operator c# [duplicate]矩阵重载运算符c#
【发布时间】:2013-04-12 01:06:07
【问题描述】:

我需要在 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;

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

【问题讨论】:

  • 是的,Fls'Zen 是正确的 - 这是重复的并且有正确的答案

标签: c# matrix operators overloading


【解决方案1】:

好吧,首先,在你尝试使用操作符之前,试着只编译操作符方法。它不会编译,并且错误消息告诉:

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

这正是它所说的:如果你编写一个类C,你可以为C + &lt;any type&gt;(或&lt;any type&gt; + C)编写一个加法运算符。您不能以某种方式定义不涉及C 的运算符。所以,很简单,因为你不是编写int[,] 类的人,所以你不能为它定义一个操作符。

您最好的选择可能是自己定义一个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);
    }
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案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);
      

      【讨论】:

      • 谢谢!我不知道。
      • 我不相信这个解决方案。这不是覆盖运算符,您只是实现了一个方法。 A.Add(B)的语法和A+B的语法是不一样的只是计算值。您的队友也不清楚 Add 是返回矩阵还是返回 void。他们必须看看你的方法。另一方面,如果他们在代码中看到 A + B,他们就会一目了然。
      • @LajosArpad 我知道我只是在编造一种新方法……我明确地说。你不能在int[,] 中使用运算符,所以如果你想要类似的东西,你必须编写自己的类,我认为这不是更清楚。你不知道它是否返回void?阅读该死的方法签名。
      • 没有必要粗鲁。首先,如果您可以编写更好的代码,我不想阅读方法签名。我想看到 A + B 而不是 A.Add(B)。就是这么简单。另外,也许我对你不够清楚。我会更明确,所以你会明白...... op 已经谈到了矩阵和运算符覆盖。这意味着他应该创建一个名为 Matrix 的类并覆盖 + 运算符。如果您不竭尽全力表现粗鲁,您可能会从我的第一条评论中理解这一点。
      • 我不是故意无礼的,所以我们也不要讽刺。我第一次确实理解它,这是其他人的建议。另请注意,问题是“为什么不”,所以我回答“因为”。我只是提出一个替代方案。优点是它使用内置类型,缺点是(也许)没有智能感知/文档,它的行为不够清晰。使用运算符的优点是它的行为是(应该是?)隐式的,但缺点是你正在创建一个全新的类来使用矩阵,当有一个内置类型时。所以自定义整个类与方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多