Когда метод интерфейса не имеет параметров, почему не распознается реализация метода со всеми необязательными параметрами? - PullRequest
5 голосов
/ 14 июля 2011

Я играл с необязательными параметрами и натолкнулся на следующий сценарий.

Если у меня в классе есть метод, в котором все параметры являются необязательными, я могу написать следующий код:

public class Test
{
    public int A(int foo = 7, int bar = 6)
    {
        return foo*bar;
    }
}
public class TestRunner
{
    public void B()
    {
        Test test = new Test();
        Console.WriteLine(test.A()); // this recognises I can call A() with no parameters
    }
}

Если я затем создаю интерфейс, такой как:

public interface IAInterface
    {
        int A();
    }

Если я заставлю класс Test реализовать этот интерфейс, он не будет компилироваться, так как говорит, что член интерфейса A () из IAInterface не реализован. Почему реализация интерфейса не разрешена как метод со всеми необязательными параметрами?

Ответы [ 3 ]

4 голосов
/ 14 июля 2011

Это два разных метода. Один с двумя параметрами, один с нулем. Необязательные параметры - просто синтаксический сахар. Ваш метод B будет скомпилирован в следующее:

public void B()
{
    Test test = new Test();
    Console.WriteLine(test.A(7, 6));
}

В этом можно убедиться, посмотрев сгенерированный код IL.

1 голос
/ 14 июля 2011

Возможно, вы захотите прочитать серию статей в блоге Эрика Липперта на эту тему. Он показывает такие угловые случаи и позволит вам понять, почему это на самом деле разные методы.

http://ericlippert.com/2011/05/09/optional-argument-corner-cases-part-one/

0 голосов
/ 14 июля 2011

Как только вам потребуется Test для реализации IAInterface, у вас теперь есть класс, который не соответствует контракту. Интерфейс должен удовлетворяться явно. Компилятор не определит, что A () и A (int foo = 7, int bar = 6) одинаковы, потому что это не так. У них есть две разные подписи: одна, которая не допускает никаких параметров, и другая, которая будет предоставлять значения по умолчанию, если значения не предоставлены.

...