This question already has an answer here:
Optional parameters and inheritance
(1个答案)
5年前关闭。
我最近遇到以下行为;
我的问题是;为什么编译器不拒绝使用与接口上定义的默认值不同的默认值的PrintMessage实现?
因为usingInterface的编译时类型为IOptionalParamTest。
usingConcrete的编译时类型为OptionalParamTest,因此它在此处查找要插入的值,并且调用变为
(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