错误CS0121与双精度和整型
本文关键字:整型 双精度 CS0121 错误 | 更新日期: 2023-09-27 18:05:05
我有一个错误:
下面是我的代码:错误CS0121调用在以下方法或方法之间有二义性属性:"程序。calculateFee(double, int)'和Program.calculateFee(双)DailyRate。
void run()
{
double fee = calculateFee();
Console.WriteLine("Fee is {0}", fee);
}
private double calculateFee(double theDailyRate = 500.0, int no0fdays = 1)
{
Console.WriteLine("calculateFee using two optional parameters");
return theDailyRate * no0fdays;
}
private double calculateFee(double dailyRate = 500.0)
{
Console.WriteLine("calculateFee using one optional parameter");
int defaultNo0fDays = 1;
return dailyRate * defaultNo0fDays;
}
private double calulateFee()
{
Console.WriteLine("calculateFee using hardcoded values");
double defaultDailyRate = 400.0;
int defaultNo0fDays = 1;
return defaultNo0fDays * defaultDailyRate;
}
}
}
编辑:为什么这个可以工作??
static void Main(string[] args)
{
(new Program()).run();
}
void run()
{
double fee = calculateFee();
Console.WriteLine("Fee is {0}", fee);
}
private double calculateFee(double theDailyRate = 500.0, int noOfDays = 1)
{
Console.WriteLine("calculateFee using two optional parameters");
return theDailyRate * noOfDays;
}
private double calculateFee(double dailyRate = 500.0)
{
Console.WriteLine("calculateFee using one optional parameter");
int defaultNoOfDays = 1;
return dailyRate * defaultNoOfDays;
}
private double calculateFee()
{
Console.WriteLine("calculateFee using hardcoded values");
double defaultDailyRate = 400.0;
int defaultNoOfDays = 1;
return defaultDailyRate * defaultNoOfDays;
}
EDIT
第二个例子可以工作,因为您已经修复了calulateFee()
的拼写错误,允许编译器绑定到完全匹配调用的方法(没有参数)。
当calculateFee
拼写错误时,编译器没有找到完全匹配名称和参数的方法,因此它开始搜索适当的重载。它找到两个——一个有一个可选参数,一个有两个可选参数。重载解析规则不允许编译器选择一个方法而不是另一个方法,因此它会导致构建错误。
- 如果找到多个候选,则将优先转换的重载解析规则应用于显式指定的参数。可选参数的省略参数将被忽略。
- 如果两个候选者被判断为同样好,优先考虑没有可选参数的候选者,其参数在调用中被省略。这是对具有较少参数的候选重载解析的一般偏好的结果。
由于最后一个方法与您的呼叫签名完全匹配,因此选择它。当拼写错误时,另外两个"同样好"的候选人被发现。由于可选参数被忽略,因此没有规则规定必须选择一个重载而不是另一个重载。
原始回答
您有一个具有可选double
参数的方法,另一个具有可选double
参数和可选int
参数的方法。当您在不带参数的情况下调用它时,编译器不知道您是想在不带参数的情况下调用该方法,还是只带double
参数,还是带double
和int
参数。你有一些选项来解决这个问题:
使用可选参数或使用重载;
原因是在run()中调用了calculateFee()
因为两个方法都只有可选参数,所以它不知道你要调用的是哪一个(因此有歧义)。
可选参数意味着它们可以包含在调用中也可以不包含在调用中。这些方法应该合并到最上面的一个calculateFee(double theDailyRate = 500.0, int noOfDays = 1)。
private double calculateFee(double theDailyRate = 500.0, int no0fdays = 1){
...
}
private double calculateFee(double dailyRate = 500.0)
{
...
}