重载+运算符以添加两个数组

时间:2009-11-06 12:50:51

标签: c# operator-overloading

这个C#代码出了什么问题?我试图重载+运算符以添加两个数组,但得到如下错误消息:

二元运算符的一个参数必须是包含类型。

class Program
{
  public static void Main(string[] args)
  {
      const int n = 5;

      int[] a = new int[n] { 1, 2, 3, 4, 5 };
      int[] b = new int[n] { 5, 4, 3, 2, 1 };
      int[] c = new int[n];

      // c = Add(a, b);
      c = a + b;

      for (int i = 0; i < c.Length; i++)
      {
        Console.Write("{0} ", c[i]);
      }

      Console.WriteLine();
  }

  public static int[] operator+(int[] x, int[] y)
  // public static int[] Add(int[] x, int[] y)
  {
      int[] z = new int[x.Length];

      for (int i = 0; i < x.Length; i++)
      {
        z[i] = x[i] + y[i];
      }

      return (z);
  }
}

5 个答案:

答案 0 :(得分:16)

必须在“相关”类的主体内声明操作符。例如:

public class Foo
{
    int X;

    // Legal
    public static int operator+(int x, Foo y);

    // This is not
    public static int operator+(int x, int y);
}

由于您无权访问数组的实现,因此最好的办法是将数组包装在自己的实现中,这样就可以提供额外的操作(这是使操作符+工作的唯一方法。 / p>

另一方面,您可以定义一个扩展方法,如:

public static class ArrayHelper
{
    public static int[] Add(this int[] x, int[] y) { ... }
}

仍然会导致自然调用(x.Add(y)),同时避免在自己的类中包装数组。

答案 1 :(得分:2)

它指出运算符的一个参数需要与运算符函数的成员类型相同。因此,如果operator函数是MyClass的成员,则参数需要是MyClass类型。

class MyClass
{
 ...

public static int[] operator+(MyClass x, int[] y)
  // public static int[] Add(int[] x, int[] y)
  {
      int[] z = new int[x.Length];

      for (int i = 0; i < x.Length; i++)
      {
        z[i] = x[i] + y[i];
      }

      return (z);
  }
}

答案 2 :(得分:2)

您可以使用以下内容:

class Program {
  static void Main(string[] args) {
    const int n = 5;

    var a = new int[n] { 1, 2, 3, 4, 5 }.WithOperators();
    var b = new int[n] { 5, 4, 3, 2, 1 };

    int[] c = a + b;

    for (int i = 0; i < c.Length; i++) {
      Console.Write("{0} ", c[i]);
    }

    Console.WriteLine();
  }
}

public static class Int32ArrayExtensions {
  public static Int32ArrayWithOperators WithOperators(this int[] self) {
    return self;
  }
}

public class Int32ArrayWithOperators {
  int[] _array;

  public Int32ArrayWithOperators(int[] array) {
    if (array == null) throw new ArgumentNullException("array");
    _array = array; 
  }

  public static implicit operator Int32ArrayWithOperators(int[] array) {
    return new Int32ArrayWithOperators(array); 
  }
  public static implicit operator int[](Int32ArrayWithOperators wrapper) {
    return wrapper._array;
  }

  public static Int32ArrayWithOperators operator +(Int32ArrayWithOperators left, Int32ArrayWithOperators right) {
    var x = left._array;
    var y = right._array;
    return x.Zip(y, (a, b) => a + b).ToArray();
  }
}

基于我写的相关post

答案 3 :(得分:1)

如果要在AA和BB类型之间重载le +运算符,则必须在AA或BB类中进行,而不是在名为Program的类中(与您一样)。

不幸的是,无法在数组类中编写代码。

你可以做的是

  • 创建自己的实现IList
  • 的类
  • 并将+运算符放在该类上。

如果您需要更详细的实施,请问我。

答案 4 :(得分:1)

您只能将运算符添加到您自己创建的类型中。 int[]是内置类型,您无法向其添加运算符。

您可以创建自己的类来封装数组,并将运算符添加到其中。