考虑这个界面:
interface ILogger
{
void Store(string payload);
}
而这是ILogger
的类实现:
class Logger : ILogger
{
void Store(string payload, bool swallowException = true)
{
...
}
}
我预计编译器会将swallowException
识别为可选参数,从而满足接口的要求。然而,实际情况是编译器抱怨Logger
没有实现接口成员Store
。
我尝试过另一个有趣的事情,就是显式地实现接口,像这样:
class Logger : ILogger
{
void ILogger.Store(string payload, bool swallowException = true)
{
...
}
}
编译器发出警告:“指定给参数 'swallowException' 的默认值将无效,因为它适用于在不允许可选参数的情况下使用的成员。” 这似乎表明可选参数与显式接口定义不兼容,但是为什么呢?我可以通过重载
Store
的两个单独函数定义来解决这个问题(即可选参数存在之前的做法)。 但是,我喜欢可选参数的语法清晰性,并希望它按我所期望的方式正常工作。我明白可能有一个合理的(历史或其他)解释说明为什么事情是这样的,但是我似乎无法弄清楚。