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

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

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

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

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

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

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

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

它指出运算符的一个参数需要与运算符函数属于同一类型。 因此,如果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); } } 

你可以使用这样的东西:

 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 。

当你想在类型AA和BB之间重载le +运算符时,你必须在AA或BB类中进行,而不是在名为Program的类中(就像你做的那样)。

遗憾的是,您无法在Array类中编写代码

你能做的就是

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

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

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

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