Перегруженный оператор (ошибка NullReferenceException) - C#
Формулировка задачи:
Первый раз пытаюсь реализовать перегруженные операторы и вот такая ошибка:
NullReferenceException на строках 43 и 138.
Оператор + и - мне нужны для поэлементной суммы и разности
Помогите сделать верно. Спасибо =)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Laba8
{
class Work
{
private int begin;
private int length;
int[] Arr;
public int Begin
{
get { return begin; }
set { begin = value; }
}
public int Length
{
get { return Arr.Length; }
set { length = value; }
}
public Work(int length, int begin)
{
this.begin = begin;
this.length = length;
Arr = new int[length];
}
public Work()
{
}
public static Work operator +(Work a, Work b)
{
Work arr = new Work();
arr.Length = b.Length;
for (int i = 0; i < 6; i++)
{
arr.Arr[i] = a.Arr[i] + b.Arr[i];
}
return arr;
}
public static Work operator -(Work a, Work b)
{
Work arr = new Work();
for (int i = 0; i < 6; i++)
{
arr.Arr[i] = a.Arr[i] - b.Arr[i];
}
return arr;
}
public int this[int begin]
{
get
{
if ((begin < 0) || (begin > Arr.Length))
throw new ArgumentOutOfRangeException();
return Arr[begin];
}
set
{
if ((begin < 0) || (begin > Arr.Length))
throw new ArgumentOutOfRangeException();
Arr[begin] = value;
}
}
public void Filling()
{
int TheEnd = 0;
if (Begin >= 0) TheEnd = (Length - Begin) - 1; else TheEnd = (Length + Begin) - 1;
Random R = new Random();
for (int i = Begin; i <= TheEnd; i++)
{
Arr[i] = R.Next(1, 9);
}
Console.WriteLine("Массив заполнен. Нажмите Enter");
Console.ReadLine();
}
public void PrintAllArray()
{
int TheEnd = 0;
if (Begin >= 0) TheEnd = (Length - Begin) - 1; else TheEnd = (Length + Begin) - 1;
for (int i = Begin; i <= TheEnd; i++)
{
Console.Write("{0} ", Arr[i]);
}
Console.WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
Work one = new Work(6, 0);
Work two = new Work(6, 0);
Work three;
one.Filling();
two.Filling();
Console.WriteLine("Первый массив:");
one.PrintAllArray();
Console.WriteLine("Второй массив:");
two.PrintAllArray();
three = one + two;
}
}
}Решение задачи: «Перегруженный оператор (ошибка NullReferenceException)»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Laba8
{
class Work
{
private int begin;
//private int length; //не нужно
int[] Arr;
public int Begin
{
get { return begin; }
set { begin = value; }
}
public int Length
{
get { return Arr.Length; }
}
public Work(int length, int begin)
{
this.begin = begin;
// this.length = length; //не нужно
Arr = new int[length];
}
public Work()
{
}
public int this[int index]
{
get
{
if (index < begin || index > begin + Arr.Length - 1)
throw new Exception("Неверно указан индекс!");
else
return Arr[index - begin];
}
set
{
if (index < begin || index > begin + Arr.Length - 1)
throw new Exception("Неверно указан индекс!");
else
Arr[index - begin] = value;
}
}
public static Work operator +(Work a, Work b)
{
if(a.begin !=b.begin | a.Length !=b.Length) //в метод вычитания тоже нужно добавить такую проверку
throw new Exception("Попытка суммирования массивов с разными границами индексов!");
Work arr = new Work(b.Length, 0);
for (int i = 0; i < a.Length; i++)
{
arr.Arr[i] = a.Arr[i] + b.Arr[i];
}
return arr;
}
public static Work operator -(Work a, Work b)
{
Work arr = new Work(b.Length, 0);
for (int i = 0; i < a.Length; i++)
{
arr.Arr[i] = a.Arr[i] - b.Arr[i];
}
return arr;
}
public static Work operator *(Work a, int x)
{
Work arr = new Work(a.Length, 0);
for (int i = 0; i < a.Length; i++)
{
arr.Arr[i] = a.Arr[i] * x;
}
return arr;
}
public static Work operator /(Work a, int x)
{
Work arr = new Work(a.Length, 0);
for (int i = 0; i < a.Length; i++)
{
arr.Arr[i] = a.Arr[i] / x;
}
return arr;
}
public void Filling()
{
Random R = new Random();
for (int i = 0; i < Arr.Length ; i++)//исправление (все проверки границ индексов - для обращения к элементам снаружи)
{
Arr[i] = R.Next(1, 9);
}
Console.Write("Массив заполнен. Нажмите Enter");
Console.ReadLine();
}
public void PrintAllArray()
{
for (int i = 0; i < Arr.Length; i++)//исправление
{
Console.Write("{0} ", Arr[i]);
}
Console.WriteLine();
}
public void PrintElement(int i)
{
// int TheEnd = 0;
// if (Begin >= 0) TheEnd = (Length - Begin) - 1; else TheEnd = (Length + Begin) - 1;
Console.WriteLine("One({0}) = {1}", i, Work[i]); //а для проверки и преобразования индекса есть индексатор
}
}
class Program
{
static void Main(string[] args)
{
Work one = new Work(6, 5);
Work two = new Work(6, 5);
Work three;
one.Filling();
two.Filling();
Console.WriteLine("Первый массив:");
one.PrintAllArray();
Console.WriteLine("Второй массив:");
two.PrintAllArray();
three = one + two;
Console.WriteLine("Сумма первого и второго:");
three.PrintAllArray();
three = one * 3;
Console.WriteLine("Умножение на One на 3");
three.PrintAllArray();
three = one / 2;
Console.WriteLine("Деление One на 2");
three.PrintAllArray();
one.PrintElement(1);
Console.ReadLine();
}
}
}