Перегруженный оператор (ошибка 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();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.538 из 5
Похожие ответы