Возьмите этот интерфейс:реализация интерфейса с дополнительными аргументами
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
с помощью двух отдельных определений функций (способ делать что-либо до того, как существуют необязательные аргументы). Однако мне нравятся необязательные аргументы для их синтаксической ясности и предпочли бы, чтобы это работало так, как я ожидаю.
Я понимаю, что, вероятно, существует разумное (историческое или иное) объяснение, почему так оно и есть, но я не могу понять это.
В моем «Googling» я раскрыл просветительскую статью в блоге Эрика Липперта, которая, кажется, предлагает ответ на мой вопрос, но мне все еще не совсем понятно. http://blogs.msdn.com/b/ericlippert/archive/2011/05/09/optional-argument-corner-cases-part-one.aspx –