C# 并非所有代码路径都在方法中返回带有输出参数的值

C# 并非所有代码路径都在方法中返回带有输出参数的值,c#,C#,我正在练习构建一个虚拟应用程序,并尝试将枚举作为参数传入,并使用一个整数输出参数来设置成员变量(BillsOwed)。我有两个具体的问题:为什么ComputeRetirementBenefitCost告诉我在控制离开当前方法之前必须分配变量,为什么ComputeRetirementBenefitCost在我的注释中标记的地方不能访问?欢迎任何和所有谨慎的未来设计建议:) 错误:控制前必须将输出参数“benefitCost”分配给: 你必须在你的开关上加一个“default:”,或者在你的开关

我正在练习构建一个虚拟应用程序,并尝试将枚举作为参数传入,并使用一个整数输出参数来设置成员变量(
BillsOwed
)。我有两个具体的问题:为什么
ComputeRetirementBenefitCost
告诉我在控制离开当前方法之前必须分配变量
,为什么
ComputeRetirementBenefitCost
在我的注释中标记的地方不能访问?欢迎任何和所有谨慎的未来设计建议:)

  • 错误:控制前必须将输出参数“benefitCost”分配给:
你必须在你的开关上加一个“default:”,或者在你的开关外设置一个值,因为你的三个案例都没有被击中

  • 为什么不能获得ComputerItemBenefitCost
修复第一个将修复这个。 使用crtl+shif+B生成并读取错误列表视图中的错误和警告。通常他们会准确地告诉你哪里出了问题。

  • 错误:控制前必须将输出参数“benefitCost”分配给:
你必须在你的开关上加一个“default:”,或者在你的开关外设置一个值,因为你的三个案例都没有被击中

  • 为什么不能获得ComputerItemBenefitCost
修复第一个将修复这个。
使用crtl+shif+B生成并读取错误列表视图中的错误和警告。通常,它们会准确地告诉您错误所在。

在方法
ComputerItemBenefitCost
中,您似乎处理了所有可能的代码流,因为
枚举Employee.EmpType
有三种不同的定义,您涵盖了所有这三种定义。但事实并非如此。从MSDN:

可以将任意整数值指定给meetingDay。例如,这行代码不会产生错误:meetingDay=(Days)42

在你的情况下,我可以这样调用你的方法

int benefitCost = 0;
ComputeRetirementBenefitCost( (Employee.EmpType) 500, out benefitCost);
在这种情况下,我将退出您的代码流,因此benefitCost将不会初始化。您可以这样更改实现:

public void ComputeRetirementBenefitCost(Employee.EmpType e, out int benefitCost)
{   

    switch (e)
    {
       case Employee.EmpType.President:
           benefitCost = 100000;
           break;
       case Employee.EmpType.Manager:
           benefitCost = 5000;
           break;
       case Employee.EmpType.Janitor:
           benefitCost = 1000;
           break; 
       default:
           throw new ArgumentOutOfRangeException("e");
    }
}

第二个问题-看起来您正试图将
ComputerItemBenefitCost
作为静态方法调用,但它不是静态的,所以只需向其添加
static
关键字即可

在方法
ComputeRetirementBenefitCost
中,您似乎处理了所有可能的代码流,因为
enum Employee.EmpType
有三种不同的定义,您涵盖了所有这三种定义。但事实并非如此。从MSDN:

可以将任意整数值指定给meetingDay。例如,这行代码不会产生错误:meetingDay=(Days)42

在你的情况下,我可以这样调用你的方法

int benefitCost = 0;
ComputeRetirementBenefitCost( (Employee.EmpType) 500, out benefitCost);
在这种情况下,我将退出您的代码流,因此benefitCost将不会初始化。您可以这样更改实现:

public void ComputeRetirementBenefitCost(Employee.EmpType e, out int benefitCost)
{   

    switch (e)
    {
       case Employee.EmpType.President:
           benefitCost = 100000;
           break;
       case Employee.EmpType.Manager:
           benefitCost = 5000;
           break;
       case Employee.EmpType.Janitor:
           benefitCost = 1000;
           break; 
       default:
           throw new ArgumentOutOfRangeException("e");
    }
}

第二个问题-看起来您正试图将
ComputerItemBenefitCost
作为静态方法调用,但它不是静态的,所以只需向其添加
static
关键字即可

我确实修好了。如果参数被初始化,我实际上不必添加语句的默认部分,但我知道更好的做法是继续添加它,我确实修复了它。如果参数被初始化,我实际上不必添加语句的默认部分,但我知道最好还是继续添加它!明白了。谢谢,是的!明白了。谢谢