Перегруженный оператор (ошибка NullReferenceException) - C#

Узнай цену своей работы

Формулировка задачи:

Первый раз пытаюсь реализовать перегруженные операторы и вот такая ошибка: NullReferenceException на строках 43 и 138. Оператор + и - мне нужны для поэлементной суммы и разности Помогите сделать верно. Спасибо =)
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace Laba8
  7. {
  8. class Work
  9. {
  10. private int begin;
  11. private int length;
  12. int[] Arr;
  13. public int Begin
  14. {
  15. get { return begin; }
  16. set { begin = value; }
  17. }
  18. public int Length
  19. {
  20. get { return Arr.Length; }
  21. set { length = value; }
  22. }
  23. public Work(int length, int begin)
  24. {
  25. this.begin = begin;
  26. this.length = length;
  27. Arr = new int[length];
  28. }
  29. public Work()
  30. {
  31. }
  32. public static Work operator +(Work a, Work b)
  33. {
  34. Work arr = new Work();
  35. arr.Length = b.Length;
  36. for (int i = 0; i < 6; i++)
  37. {
  38. arr.Arr[i] = a.Arr[i] + b.Arr[i];
  39. }
  40. return arr;
  41. }
  42. public static Work operator -(Work a, Work b)
  43. {
  44. Work arr = new Work();
  45. for (int i = 0; i < 6; i++)
  46. {
  47. arr.Arr[i] = a.Arr[i] - b.Arr[i];
  48. }
  49. return arr;
  50. }
  51.  
  52. public int this[int begin]
  53. {
  54. get
  55. {
  56. if ((begin < 0) || (begin > Arr.Length))
  57. throw new ArgumentOutOfRangeException();
  58. return Arr[begin];
  59. }
  60. set
  61. {
  62. if ((begin < 0) || (begin > Arr.Length))
  63. throw new ArgumentOutOfRangeException();
  64. Arr[begin] = value;
  65. }
  66. }
  67. public void Filling()
  68. {
  69. int TheEnd = 0;
  70. if (Begin >= 0) TheEnd = (Length - Begin) - 1; else TheEnd = (Length + Begin) - 1;
  71. Random R = new Random();
  72. for (int i = Begin; i <= TheEnd; i++)
  73. {
  74. Arr[i] = R.Next(1, 9);
  75. }
  76. Console.WriteLine("Массив заполнен. Нажмите Enter");
  77. Console.ReadLine();
  78. }
  79. public void PrintAllArray()
  80. {
  81. int TheEnd = 0;
  82. if (Begin >= 0) TheEnd = (Length - Begin) - 1; else TheEnd = (Length + Begin) - 1;
  83. for (int i = Begin; i <= TheEnd; i++)
  84. {
  85. Console.Write("{0} ", Arr[i]);
  86. }
  87. Console.WriteLine();
  88. }
  89. }
  90. class Program
  91. {
  92. static void Main(string[] args)
  93. {
  94. Work one = new Work(6, 0);
  95. Work two = new Work(6, 0);
  96. Work three;
  97. one.Filling();
  98. two.Filling();
  99. Console.WriteLine("Первый массив:");
  100. one.PrintAllArray();
  101. Console.WriteLine("Второй массив:");
  102. two.PrintAllArray();
  103. three = one + two;
  104. }
  105. }
  106. }

Решение задачи: «Перегруженный оператор (ошибка NullReferenceException)»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Laba8
  8. {
  9.     class Work
  10.     {
  11.         private int begin;
  12.         //private int length; //не нужно
  13.         int[] Arr;
  14.  
  15.         public int Begin
  16.         {
  17.             get { return begin; }
  18.             set { begin = value; }
  19.         }
  20.         public int Length
  21.         {
  22.             get { return Arr.Length; }
  23.         }
  24.         public Work(int length, int begin)
  25.         {
  26.             this.begin = begin;
  27.            // this.length = length;  //не нужно
  28.             Arr = new int[length];
  29.         }
  30.         public Work()
  31.         {
  32.  
  33.         }
  34.         public int this[int index]
  35.         {
  36.             get
  37.             {
  38.                 if (index < begin || index > begin + Arr.Length - 1)
  39.                     throw new Exception("Неверно указан индекс!");
  40.                 else
  41.                     return Arr[index - begin];
  42.             }
  43.             set
  44.             {
  45.                 if (index < begin || index > begin + Arr.Length - 1)
  46.                     throw new Exception("Неверно указан индекс!");
  47.                 else
  48.                     Arr[index - begin] = value;
  49.             }
  50.         }
  51.         public static Work operator +(Work a, Work b)
  52.         {
  53.             if(a.begin !=b.begin  | a.Length !=b.Length) //в метод вычитания тоже нужно добавить такую проверку
  54.                 throw new Exception("Попытка суммирования массивов с разными границами индексов!");
  55.             Work arr = new Work(b.Length, 0);
  56.             for (int i = 0; i < a.Length; i++)
  57.             {
  58.                 arr.Arr[i] = a.Arr[i] + b.Arr[i];
  59.             }
  60.             return arr;
  61.         }
  62.         public static Work operator -(Work a, Work b)
  63.         {
  64.             Work arr = new Work(b.Length, 0);
  65.             for (int i = 0; i < a.Length; i++)
  66.             {
  67.                 arr.Arr[i] = a.Arr[i] - b.Arr[i];
  68.             }
  69.             return arr;
  70.         }
  71.         public static Work operator *(Work a, int x)
  72.         {
  73.             Work arr = new Work(a.Length, 0);
  74.             for (int i = 0; i < a.Length; i++)
  75.             {
  76.                 arr.Arr[i] = a.Arr[i] * x;
  77.             }
  78.             return arr;
  79.         }
  80.         public static Work operator /(Work a, int x)
  81.         {
  82.             Work arr = new Work(a.Length, 0);
  83.             for (int i = 0; i < a.Length; i++)
  84.             {
  85.                 arr.Arr[i] = a.Arr[i] / x;
  86.             }
  87.             return arr;
  88.         }
  89.  
  90.         public void Filling()
  91.         {
  92.             Random R = new Random();
  93.             for (int i = 0; i < Arr.Length ; i++)//исправление (все проверки границ индексов - для обращения к элементам снаружи)
  94.             {
  95.                 Arr[i] = R.Next(1, 9);
  96.             }
  97.             Console.Write("Массив заполнен. Нажмите Enter");
  98.             Console.ReadLine();
  99.         }
  100.         public void PrintAllArray()
  101.         {
  102.             for (int i = 0; i < Arr.Length; i++)//исправление
  103.             {
  104.                 Console.Write("{0} ", Arr[i]);
  105.             }
  106.             Console.WriteLine();
  107.         }
  108.         public void PrintElement(int i)
  109.         {
  110.            // int TheEnd = 0;
  111.            // if (Begin >= 0) TheEnd = (Length - Begin) - 1; else TheEnd = (Length + Begin) - 1;
  112.             Console.WriteLine("One({0}) = {1}", i, Work[i]); //а для проверки и преобразования индекса есть индексатор
  113.         }
  114.     }
  115.     class Program
  116.     {
  117.         static void Main(string[] args)
  118.         {
  119.             Work one = new Work(6, 5);
  120.             Work two = new Work(6, 5);
  121.             Work three;
  122.  
  123.             one.Filling();
  124.             two.Filling();
  125.             Console.WriteLine("Первый массив:");
  126.             one.PrintAllArray();
  127.             Console.WriteLine("Второй массив:");
  128.             two.PrintAllArray();
  129.             three = one + two;
  130.             Console.WriteLine("Сумма первого и второго:");
  131.             three.PrintAllArray();
  132.             three = one * 3;
  133.             Console.WriteLine("Умножение на One на 3");
  134.             three.PrintAllArray();
  135.             three = one / 2;
  136.             Console.WriteLine("Деление One на 2");
  137.             three.PrintAllArray();
  138.             one.PrintElement(1);
  139.             Console.ReadLine();
  140.         }
  141.     }
  142. }

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


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

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

13   голосов , оценка 4.538 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы