我有一个错误:
错误CS0121以下方法或之间的调用不明确 properties:'Program.calculateFee(double,int)'和 'Program.calculateFee(double)'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;
}
答案 0 :(得分:5)
修改强>
第二个示例有效,因为您修复了calulateFee()
的拼写错误,允许编译器绑定到完全与调用匹配的方法(无参数)。
当calculateFee
拼写错误时,编译器找不到完全匹配名称和参数的方法,因此它开始搜索适当的重载。它找到两个 - 一个有一个可选参数,一个有两个。重载决策规则不允许编译器选择另一个方法,因此会导致构建错误。
来自MSDN:
- 如果找到多个候选项,则首选转换的重载解析规则将应用于显式指定的参数。忽略可选参数的省略参数。
- 如果两个候选人被判断为同样好,则优先选择没有可选参数的候选人,其中参数在呼叫中被省略。这是对具有较少参数的候选者的重载分辨率的一般偏好的结果。
由于最后一个方法与您的主叫签名完全匹配,因此选择它。当它拼写错误时,另外两个同样好的"候选人被发现。由于忽略了可选参数,因此没有规则要求选择一个重载而不是另一个。
原始回答
您有一个带有可选double
参数的方法,另一个带有可选double
参数和可选int
参数的方法。当您在没有参数的情况下调用它时,编译器不知道您是否要使用double
参数或double
和int
参数调用不带参数的方法。你有一些选择来解决这个问题:
使用可选参数或使用重载;没有理由同时使用它们。
答案 1 :(得分:1)
原因是在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)
{
...
}