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