Перегруженный оператор (ошибка 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();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д