通过调用计算taxAmount的方法,无法获得除$ 0之外的任何内容

我在接下来的电话中遇到了麻烦,特别是最后一个组件:

Console.WriteLine("Taxpayer # {0} SSN: {1}, Income is {2:c}, Tax is {3:c}", i + 1, taxArray[i].SSN, taxArray[i].grossIncome, taxRates.CalculateTax(taxArray[i].grossIncome)); 

我正在调用Yield类中的CalculateTax方法,该类在main中作为taxRates启动。

这是CalculateTax方法

 public int CalculateTax(int income) { int taxOwed; // If income is less than the limit then return the tax as income times low rate. if (income = incLimit) { taxOwed = Convert.ToInt32(income * highTaxRate);} else taxOwed = 0; return taxOwed; } 

incLimit,lowTaxRate和highTaxRate先前已设置

任何想法为什么这总是出现0.我甚至发送方法一个像50000的数字仍然回到0。

我只能使用该方法获取一个值,所以它是其他东西,这里是代码

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Assignment5_2 { public class Rates { // Create a class named rates that has the following data members: int incLimit; double lowTaxRate; double highTaxRate; // use read-only accessor public int IncomeLimit { get { return incLimit; } } public double LowTaxRate { get { return lowTaxRate; } } public double HighTaxRate { get { return highTaxRate; } } //A class constructor that assigns default values public void assignRates() { //int limit = 30000; //double lowRate = .15; //double highRate = .28; incLimit = 30000; lowTaxRate = .15; highTaxRate = .28; } //A class constructor that takes three parameters to assign input values for limit, low rate and high rate. public void assignRates(int lim, double low, double high) { incLimit = lim; lowTaxRate = low; highTaxRate = high; } // A CalculateTax method that takes an income parameter and computes the tax as follows: public int CalculateTax(int income) { int taxOwed; // If income is less than the limit then return the tax as income times low rate. if (income  temp.taxOwed) returnVal = 1; else if (this.taxOwed < temp.taxOwed) returnVal = -1; else returnVal = 0; return returnVal; } // End IComparable.CompareTo public static void GetRates() { // Local method data members for income limit, low rate and high rate. int incLimit; double lowRate; double highRate; string userInput; Rates rates = new Rates(); // Prompt the user to enter a selection for either default settings or user input of settings. Console.Write("Would you like the default values (D) or would you like to enter the values (E)?: "); /* If the user selects default the default values you will instantiate a rates object using the default constructor * and set the Taxpayer class data member for tax equal to the value returned from calling the rates object CalculateTax method.*/ userInput = (Console.ReadLine()); if (userInput == "D" || userInput == "d") { rates.assignRates(); } // end if /* If the user selects to enter the rates data then prompt the user to enter values for income limit, low rate and high rate, * instantiate a rates object using the three-argument constructor passing those three entries as the constructor arguments and * set the Taxpayer class data member for tax equal to the valuereturned from calling the rates object CalculateTax method. */ else if (userInput == "E" || userInput == "e") { Console.Write("Please enter the income limit: "); incLimit = Convert.ToInt32(Console.ReadLine()); Console.Write("Please enter the low rate: "); lowRate = Convert.ToDouble(Console.ReadLine()); Console.Write("Please enter the high rate: "); highRate = Convert.ToDouble(Console.ReadLine()); //Rates rates = new Rates(); rates.assignRates(incLimit, lowRate, highRate); } else Console.WriteLine("You made an incorrect choice"); } static void Main(string[] args) { Taxpayer[] taxArray = new Taxpayer[5]; Rates taxRates = new Rates(); // Implement a for-loop that will prompt the user to enter the Social Security Number and gross income. for (int x = 0; x < taxArray.Length; ++x) { taxArray[x] = new Taxpayer(); Console.Write("Please enter the Social Security Number for taxpayer {0}: ", x + 1); taxArray[x].SSN = Console.ReadLine(); Console.Write("Please enter the gross income for taxpayer {0}: ", x + 1); taxArray[x].grossIncome = Convert.ToInt32(Console.ReadLine()); } Taxpayer.GetRates(); // Implement a for-loop that will display each object as formatted taxpayer SSN, income and calculated tax. for (int i = 0; i < taxArray.Length; ++i) { Console.WriteLine("Taxpayer # {0} SSN: {1}, Income is {2:c}, Tax is {3:c}", i + 1, taxArray[i].SSN, taxArray[i].grossIncome, taxRates.CalculateTax(50000));//taxRates.CalculateTax(taxArray[i].grossIncome)); } // end for // Implement a for-loop that will sort the five objects in order by the amount of tax owed Array.Sort(taxArray); Console.WriteLine("Sorted by tax owed"); for (int i = 0; i < taxArray.Length; ++i) { Console.WriteLine("Taxpayer # {0} SSN: {1}, Income is {2:c}, Tax is {3:c}", i + 1, taxArray[i].SSN, taxArray[i].grossIncome, taxRates.CalculateTax(taxArray[i].grossIncome)); } } //end main } // end Taxpayer class } //end 

无摄制。 使用下面的简单程序,我得到有效的非零结果( 900使用我的值):

 internal class Program { private static int incLimit = 30000; private static float lowTaxRate = 0.18F; private static float highTaxRate = 0.30F; private static void Main(string[] args) { var result = CalculateTax(5000); } public static int CalculateTax(int income) { int taxOwed; // If income is less than the limit then return the tax // as income times low rate. if (income < incLimit) { taxOwed = Convert.ToInt32(income * lowTaxRate); } // If income is greater than or equal to the limit then // return the tax as income times high rate. else if (income >= incLimit) { taxOwed = Convert.ToInt32(income * highTaxRate); } else taxOwed = 0; return taxOwed; } } 

您的问题在于您使用Rates.assignRates()方法。 您只能从静态Taxpayer.GetRates()方法调用它。 此方法作用于本地Rates对象,然后将填充的对象抛出。 您可能希望更改Taxpayer.GetRates()以返回Rates对象,返回内部创建(和填充)的rates变量:

 public static Rates GetRates() { ... return rates; } 

然后在Main()中,删除对Taxpayer.GetRates()的现有调用,并更改声明taxRates变量的行,如下所示:

 Rates taxRates = Taxpayer.GetRates(); 

另请注意,您还应该以某种方式处理由于输入错误/丢失而导致的错误情况,但您现在似乎没有这样做,所以除了让您回到已填充的Rates对象之外,我没有包含任何function更改。

此外,您可能需要考虑使Rates类保持静态,因为您似乎只使用它的单个实例。

你的最后决定点else taxOwed = 0; 永远不会执行,所以不需要。 我运行了你的代码,如下所示,一切正常。 问题必须是传递给方法的参数为零,或者您没有像您认为的那样设置值。

 void Main() { var result = CalculateTax(40000); Console.WriteLine(result); } public int CalculateTax(int income) { var incLimit = 50000; var lowTaxRate = 0.10; var highTaxRate = 0.25; int taxOwed; if (income < incLimit){ taxOwed = Convert.ToInt32(income * lowTaxRate); } else if(income >= incLimit) { taxOwed = Convert.ToInt32(income * highTaxRate);} return taxOwed; } 

更新

现在您发布了完整的代码,您的问题是您需要更改静态GetRates()方法以返回费率,正如Clark所提到的那样。 这种静态方法是唯一调用rates.assignRates()和那些分配的速率的地方,只适用于该方法中包含的特定rates实例,而不是其他任何地方。 因此,将GetRates()更改为返回rates实例,如下所示:

  public static Rates GetRates() { ... Rates rates = new Rates(); ... return rates; } 

然后更改main方法如下:

 static void Main(string[] args) { Taxpayer[] taxArray = new Taxpayer[5]; // Implement a for-loop that will prompt the user to enter // the Social Security Number and gross income. ... Rates taxRates = Taxpayer.GetRates(); // Implement a for-loop that will display each object as formatted // taxpayer SSN, income and calculated tax. for (int i = 0; i < taxArray.Length; ++i) { Console.WriteLine( "Taxpayer # {0} SSN: {1}, Income is {2:c}, Tax is {3:c}", i + 1, taxArray[i].SSN, taxArray[i].grossIncome, taxRates.CalculateTax(50000)); } ... } 

我会在您的方法中添加调试语句,以确认lowTaxRate和hightTaxRate不为零/ null。

你确定lowTaxRate和highTaxRate没有设置为0,因为任何乘以0的都是0.放一些调试器/ MessageBox来检查它。