错误CS0121有double和int

时间:2015-07-28 14:44:12

标签: c# default-parameters

我有一个错误:

  

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

2 个答案:

答案 0 :(得分:5)

修改

第二个示例有效,因为您修复了calulateFee()的拼写错误,允许编译器绑定到完全与调用匹配的方法(无参数)。

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

来自MSDN

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

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

原始回答

您有一个带有可选double参数的方法,另一个带有可选double参数和可选int参数的方法。当您在没有参数的情况下调用它时,编译器不知道您是否要使用double参数或doubleint参数调用不带参数的方法。你有一些选择来解决这个问题:

使用可选参数或使用重载;没有理由同时使用它们。

答案 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)
    {
        ...
    }