【发布时间】:2015-05-07 15:30:14
【问题描述】:
取这个接口:
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 来解决这个问题(可选参数存在之前的处理方式)。不过,我喜欢可选参数,因为它们的语法清晰,并且希望这能按我预期的方式工作。
我知道对于为什么会这样,可能有一个合理的(历史或其他)解释,但我似乎无法弄清楚。
【问题讨论】:
-
在我的“谷歌搜索”中,我发现了 Eric Lippert 的一篇富有启发性的博客文章,似乎可以回答我的问题,但我仍然不太清楚。 blogs.msdn.com/b/ericlippert/archive/2011/05/09/…