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
关键字即可 我确实修好了。如果参数被初始化,我实际上不必添加语句的默认部分,但我知道更好的做法是继续添加它,我确实修复了它。如果参数被初始化,我实际上不必添加语句的默认部分,但我知道最好还是继续添加它!明白了。谢谢,是的!明白了。谢谢