Обработка Java делает аккуратный прием на определении переменной, если Вы не используете инициализатор по умолчанию.
{ int x; if(whatever) x=1; if(x == 1) ... }
Это даст Вам ошибку во время компиляции, что у Вас есть путь, где X правильно не определяется. Это помогло мне несколько раз, и я взял к рассмотрению инициализации по умолчанию как они:
int x=0; String s=null;
, чтобы быть плохим шаблоном, так как это блокирует эту полезную проверку.
Однако иногда трудно двигаться - я должен был возвратиться и отредактировать в =null, когда это имело смысл как значение по умолчанию, но я никогда не вставлял его на первой передаче больше.
Операторы должны быть объявлены внутри тела «связанного» класса. Например:
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)
), избегая при этом оборачивания массивов собственными класс.
В нем говорится, что один из параметров оператора должен быть того же типа, что и операторная функция. Поэтому, если операторная функция является членом 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);
}
}
Если вы хотите перегрузить оператор le + между типами AA и BB, вы должны сделать это в классе AA или BB, а не в классе с именем Program (как вы это сделали).
К сожалению, вы не можете писать код в классе Array .
Вы можете
Если вам нужна более подробная реализация, просто спросите меня.
Вы можете добавлять операторы только в тот тип, который вы создаете сами. int []
- это встроенный тип, к которому нельзя добавлять операторы.
Вы можете создать свой собственный класс, инкапсулирующий массив, и добавить к нему оператор.
Вы можете использовать что-то вроде этого:
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();
}
}
На основе связанного сообщения, которое я написал.