Ошибка CS0563 (один из параметров бинарного оператора должен быть содержащим типом)

Мой исходный код (ниже) генерирует ошибку CS0563, поскольку оба параметра в моем операторе CombinedJobs + (см. «//Шаг 5: …» в исходном коде) указаны как Job (в отличие от int, double и т. д.). Как я могу изменить этот код, чтобы устранить эту ошибку? Этот код является ответом на задание, указанное ниже.

Назначение:

«Разработайте класс «Работа» для Домашней службы Гарольда. Класс содержит четыре поля данных: описание работы (например, «мыть окна»), время в часах для выполнения работы (например, 3,5), почасовая ставка, взимаемая за выполнение работы. Задание (например, 25 долл. США) и общая стоимость задания (почасовая ставка, умноженная на количество часов). Включите свойства для получения и установки каждого поля, кроме общего вознаграждения — это поле будет доступно только для чтения, и его значение вычисляется каждый раз либо устанавливается почасовая оплата или количество часов. Перегружайте оператор +, чтобы можно было добавить два задания. Сумма двух заданий — это новое задание, содержащее описания обоих исходных заданий (соединенных «и»), сумма время в часах для исходных заданий и среднее значение почасовой ставки для исходных заданий. Напишите функцию Main(), которая демонстрирует правильную работу всех методов. Сохраните файл как DemoJobs.cs».

Из: Microsoft® Visual C#® 2008, Введение в объектно-ориентированное программирование, 3e, Джойс Фаррелл

Исходный код:

using System;

//Step 1: Creating the Job class and designating its fields

   public class Job

   {

      private string jobDescription;

      private int jobTotalTime;

      private double jobRate;

      private double jobTotalFee;


//Step 2: Using the 'this' object will allow me to designate values for 

//"this" instantiation of an object later in the program

      public string JobDescription
      {
         get
         {
            return this.jobDescription;
         }
         set
         {
            this.jobDescription = value;
         }
      }  

      public int JobTotalTime
      {
         get
         {
            return this.jobTotalTime;
         }
         set
         {
            this.jobTotalTime = value;
         }
      }  

     public double JobRate
      {
         get
         {
            return this.jobRate;
         }
         set
         {
            this.jobRate = value;
         }
      }       

    public double JobTotalFee
      {
         get
         {
            return this.jobTotalFee;
         }
         set
         {
            this.jobTotalFee = this.JobRate * this.JobTotalTime;
         }
      }  

//Step 3: Creating a method will allow me to display the different jobs 

//with their descriptions and other variable fields later in the program

   public void JobMessage()

   {

      Console.WriteLine("Job description: {0} /nTotal time needed to complete the job: {1} hours /nHourly fee: ${2} /nTotal fee for the job is: ${3}", this.JobDescription, this.JobTotalTime, this.JobRate, this.JobTotalFee);

   }


}

//Step 4: Creating two instantiations of the Job Class

public class CreateTwoJobs

{

   public static void Main()

   {

   Job jobA = new Job();

   Job jobB = new Job();


   jobA.JobDescription = "washing windows";

   jobA.JobTotalTime = 5;

   jobA.JobRate = 25.00;


   jobB.JobDescription = "walking dogs";

   jobB.JobTotalTime = 10;

   jobB.JobRate = 11.00;


   jobA.JobMessage();

   jobB.JobMessage();

   }

}


//Step 5: Creating a third instantiation of the Job Class that is a combination 

//of the first two instantiations using the overloaded + operator


public class CombinedJobs

{

   public CombinedJobs(string jobDescription, int jobTotalTime, double jobRate, double jobTotalFee)

   {

   JobDescription = jobDescription;

   JobTotalTime = jobTotalTime;

   JobRate = jobRate;

   JobTotalFee = jobTotalFee;

   }


   public static CombinedJobs operator+(Job jobA, Job jobB)

   {

   string newDescription = jobA.JobDescription + " and " + jobB.JobDescription;

   int newTotalTime = jobA.JobTotalTime + jobB.JobTotalTime;

   double newJobRate = (jobA.JobRate + jobB.JobRate) / 2;

   double newTotalFee = newJobRate * newTotalTime

   }


   public void CombinedJobMessage()

   {

      Console.WriteLine("Job description: {0} /nTotal time needed to complete the job: {1} hours /nHourly fee: ${2} /nTotal fee for the job is: ${3}", newDescription, newTotalTime, newJobRate, newTotalTime);

   }   


   public static void Main()

   {

      CombinedJobMessage();

   }

}      

person Nooob    schedule 30.10.2010    source источник
comment
Установщик JobTotalFee равен EVIL. И ваш код был бы намного короче, если бы вы использовали автоматические свойства. Я бы использовал public double JobTotalFee { get {return this.JobRate * this.JobTotalTime;}}; вообще без поля поддержки. Но ваше назначение требует, чтобы вы установили резервное поле в установщиках JobRate и JobTotalTime. Не знаю, почему.   -  person CodesInChaos    schedule 30.10.2010


Ответы (1)


Метод operator+ должен находиться внутри класса одного из его параметров. Поскольку в вашем случае оба параметра равны Job, метод должен находиться внутри класса Job. Он не может быть внутри CombinedJobs.

Кроме того, вы объявили, что оператор возвращает CombinedJobs, так что это означает, что вы действительно должны вернуть его. Это не вызывает ошибку, которую вы описываете, но может вызвать другую ошибку компиляции.

person svick    schedule 30.10.2010
comment
Спасибо, это было очень полезно. Я почти получил эту программу в рабочем состоянии сейчас. Осталось одно... - person Nooob; 31.10.2010