This question already has an answer here:
Optional parameters and inheritance
                                
                                    (1个答案)
                                
                        
                                5年前关闭。
            
                    
我最近遇到以下行为;

internal interface IOptionalParamTest
{
    void PrintMessage(string message = "Hello");
}

class OptionalParamTest : IOptionalParamTest
{
    public void PrintMessage(string message = "Goodbye")
    {
        Console.WriteLine(message);
    }
}

internal class Program
{
    static void Main()
    {
        IOptionalParamTest usingInterface = new OptionalParamTest();
        usingInterface.PrintMessage(); // prints "Hello"

        OptionalParamTest usingConcrete = new OptionalParamTest();
        usingConcrete.PrintMessage();// prints "Goodbye"
    }
}


我的问题是;为什么编译器不拒绝使用与接口上定义的默认值不同的默认值的PrintMessage实现?

最佳答案

调用PrintMessage();只是语法糖。没有方法PrintMessage()接受零参数。编译器只是插入正确的值。因此,编译器将第一个调用更改为:

PrintMessage("Hello");


因为usingInterface的编译时类型为IOptionalParamTest。

usingConcrete的编译时类型为OptionalParamTest,因此它在此处查找要插入的值,并且调用变为

PrintMessage("Goodbye")

09-11 23:48