“使用未分配的局部变量”是什么意思?

我一直收到annualRate,monthlyCharge和lateFee的错误。

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lab_5___Danny_Curro { class Program { static void Main(string[] args) { string firstName; string lastName; int accNumber; string creditPlan; double balance; string status; Boolean late = false; double lateFee; double monthlyCharge; double annualRate; double netBalance; Console.Write("Enter First Name: "); firstName = Console.ReadLine(); Console.Write("Enter Last Name: "); lastName = Console.ReadLine(); Console.Write("Enter Account Number: "); accNumber = Convert.ToInt32(Console.ReadLine()); Console.Write("Enter Credit Card Plan Number[Blank Will Enter Plan 0]: "); creditPlan = Console.ReadLine(); Console.Write("Enter Balance: "); balance = Convert.ToDouble(Console.ReadLine()); Console.Write("Is This Account Late?: "); status = Console.ReadLine().Trim().ToLower(); if (creditPlan == "0") { annualRate = 0.35; //35% lateFee = 0.0; monthlyCharge = balance * (annualRate * (1 / 12)); return; } if (creditPlan == "1") { annualRate = 0.30; //30% if (status == "y") { late = true; } else if (status == "n") { late = false; } if (late == true) { lateFee = 25.00; } monthlyCharge = balance * (annualRate * (1 / 12)); return; } if (creditPlan == "2") { annualRate = 0.20; //20% if (status == "y") { late = true; } else if (status == "n") { late = false; } if (late == true) { lateFee = 35.00; } if (balance > 100) { monthlyCharge = balance * (annualRate * (1 / 12)); } else { monthlyCharge = 0; } return; } if (creditPlan == "3") { annualRate = 0.15; //15% lateFee = 0.00; if (balance > 500) { monthlyCharge = (balance - 500) * (annualRate * (1 / 12)); } else { monthlyCharge = 0; } return; } netBalance = balance - (lateFee + monthlyCharge); Console.WriteLine("Name: \t\t\t {0} {1}", firstName, lastName); Console.WriteLine("Account Number: \t{0}", accNumber); Console.WriteLine("Credit Plane: \t\t{0}",creditPlan); Console.WriteLine("Account Late: \t\t{0}", late); Console.WriteLine("Balance: \t\t{0}", balance); Console.WriteLine("Late Fee: \t\t{0}", lateFee); Console.WriteLine("Interest Charge: \t{0}", monthlyCharge); Console.WriteLine("Net Balance: \t\t{0}",netBalance); Console.WriteLine("Annual Rate: \t\t{0}", annualRate); Console.ReadKey(); } } } 

编译器不够智能,不知道至少会有一个if块被执行。 因此,它不会发现annualRate都会分配像annualRate一样的变量。 以下是如何让编译器理解:

 if (creditPlan == "0") { // ... } else if (creditPlan == "1") { // ... } else if (creditPlan == "2") { // ... } else { // ... } 

编译器知道使用if / else块,其中一个块保证会被执行,因此如果您在所有块中分配变量,它将不会给编译器错误。

顺便说一句,您也可以使用switch语句而不是if以使代码更清晰。

将您的声明更改为:

 double lateFee = 0.0; double monthlyCharge = 0.0; double annualRate = 0.0; 

导致错误是因为代码中至少有一条路径,这些变量最终没有设置为任何东西。

因为如果if语句都没有计算为true,那么将取消分配局部变量。 在那里抛出else语句,并在if语句不计算为true的情况下为这些变量赋值。 如果不能使错误消失,请回到此处。

另一种选择是在代码开头声明变量时将变量初始化为某个默认值。

给他们一个默认值:

 double lateFee=0.0; double monthlyCharge = 0.0; double annualRate = 0.0; 

基本上,所有可能的路径都不会初始化这些变量。

您的分配都嵌套在条件if块中,这意味着它们有可能永远不会被分配。

在类的顶部,将它们初始化为0或其他值

您的代码中有许多路径,您的变量未初始化,这就是编译器抱怨的原因。

具体来说,您没有validationcreditPlan的用户输入 – 如果用户输入的值不是"0","1","2" or "3" ,那么所有分支都不会被执行(和creditPlan根据您的用户提示,不会默认为零)。

正如其他人所提到的,可以通过在检查分支之前对所有派生变量进行默认初始化来避免编译器错误,或者确保至少执行一个分支(即,分支的相互排他性,通过else声明)。

不过,我想指出其他可能的改进:

  • 在您信任用户输入以在代码中使用之前validation用户输入。
  • 对参数进行整体建模 – 有几个属性和计算适用于每个计划。
  • 使用更合适的数据类型。 例如, CreditPlan似乎具有有限域,并且更适合于enumerationDictionary不是string 。 财务数据和百分比应始终建模为decimal ,而不是double以避免舍入问题,并且“status”似乎是布尔值。
  • 干掉重复的代码。 计算, monthlyCharge = balance * annualRate * (1/12))对于多个分支是通用的。 出于维护原因,请勿复制此代码。
  • 可能更高级,但请注意,函数现在是C#的一等公民,因此您可以将函数或lambda指定为属性,字段或参数!

例如,这里是您的模型的替代表示:

  // Keep all Credit Plan parameters together in a model public class CreditPlan { public Func MonthlyCharge { get; set; } public decimal AnnualRate { get; set; } public Func LateFee { get; set; } } // DRY up repeated calculations static private decimal StandardMonthlyCharge(decimal balance, decimal annualRate) { return balance * annualRate / 12; } public static Dictionary CreditPlans = new Dictionary { { 0, new CreditPlan { AnnualRate = .35M, LateFee = _ => 0.0M, MonthlyCharge = StandardMonthlyCharge } }, { 1, new CreditPlan { AnnualRate = .30M, LateFee = late => late ? 0 : 25.0M, MonthlyCharge = StandardMonthlyCharge } }, { 2, new CreditPlan { AnnualRate = .20M, LateFee = late => late ? 0 : 35.0M, MonthlyCharge = (balance, annualRate) => balance > 100 ? balance * annualRate / 12 : 0 } }, { 3, new CreditPlan { AnnualRate = .15M, LateFee = _ => 0.0M, MonthlyCharge = (balance, annualRate) => balance > 500 ? (balance - 500) * annualRate / 12 : 0 } } }; 

编译器说如果CreditPlan不被识别,则annualRate将没有值。

创建局部变量(annualRate,monthlyCharge和lateFee)时,为它们分配默认值(0)。

此外,如果信用计划未知,您应该显示错误。

并非所有代码路径都为lateFee设置了值。 您可能希望在顶部为其设置默认值。

您不会在if语句之外分配值…并且可能信用可能是0,1,2或3之外的其他内容,如@iomaxx所述。

尝试将单独的if语句更改为单个if / else if / else if / else。 或者在顶部指定默认值。

如果你声明变量“annualRate”就好

课程{

 **static double annualRate;** public static void Main() { 

试试吧..