错误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; 
    }

错误CS0121与双精度和整型

EDIT

第二个例子可以工作,因为您已经修复了calulateFee()的拼写错误,允许编译器绑定到完全匹配调用的方法(没有参数)。

calculateFee拼写错误时,编译器没有找到完全匹配名称和参数的方法,因此它开始搜索适当的重载。它找到两个——一个有一个可选参数,一个有两个可选参数。重载解析规则不允许编译器选择一个方法而不是另一个方法,因此它会导致构建错误。

从MSDN:

  • 如果找到多个候选,则将优先转换的重载解析规则应用于显式指定的参数。可选参数的省略参数将被忽略。
  • 如果两个候选者被判断为同样好,优先考虑没有可选参数的候选者,其参数在调用中被省略。这是对具有较少参数的候选重载解析的一般偏好的结果。

由于最后一个方法与您的呼叫签名完全匹配,因此选择它。当拼写错误时,另外两个"同样好"的候选人被发现。由于可选参数被忽略,因此没有规则规定必须选择一个重载而不是另一个重载。

原始回答

您有一个具有可选double参数的方法,另一个具有可选double参数和可选int参数的方法。当您在不带参数的情况下调用它时,编译器不知道您是想在不带参数的情况下调用该方法,还是只带double参数,还是带doubleint参数。你有一些选项来解决这个问题:

使用可选参数或使用重载;

原因是在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)
    {
        ...
    }