Почему имена параметров необходимы в определении интерфейса? Мне разрешено выбирать новые имена параметров во время реализации

Не уверен, что это глупый вопрос, но я просто заметил это:

public interface IActivityDao : IDao<Activity>
{
    IList<Activity> GetAllSinceSequence(long sequence, int count);
}

public class ActivityDao : AbstractNHibernateDao<Core.Domain.Activity>, IActivityDao
{        
    public IList<Activity> GetAllSinceSequence(long sequence, int maxRecords)
    {

    }
}

Внутри моей реализации я назвал свой второй параметр "maxRecords". Тем не менее, в интерфейсе он определяется как "счет". Компилятор по-прежнему рассматривает реализованный интерфейс, что хорошо, но может привести к некоторой двусмысленности. Ясно, что я должен переименовать один из параметров в соответствие с другим.

Я немного поиграл, прежде чем переименовать и заметил что-то интересное. Мне не разрешено объявлять мой интерфейс как:

public interface IActivityDao : IDao<Activity>
{
    IList<Activity> GetAllSinceSequence(long, int);
}

Это просто компилятор, который слишком защищен от С# symantics? Какую цель используют имена параметров в методе интерфейса, кроме как сделать код более читаемым? Мне кажется, что он вызывает неоднозначность, если имена параметров не принудительно применяются при реализации.

Ответ 1

Имена параметров требуются в объявлении интерфейса для ясности реализации и для справки. Если кто-то использовал ваш интерфейс, имена параметров метода предназначены для самостоятельной документирования, поэтому потребитель интерфейса понимает, что передать методу (например, при просмотре описания метода через IntelliSense)

И да, когда вы реализуете интерфейс, вы можете назвать параметры, которые вы хотите.

Ответ 2

История. Это восходит к самым ранним дням .NET, когда COM управлял миром. Возможность взаимодействия с COM была очень важна тогда, никто никогда не выбрасывает все, чтобы принять совершенно новый стиль программирования.

Что сделало COM-взаимодействие сильно поддерживаемым в .NET в целом. Помимо необходимости иметь именованные аргументы для методов интерфейса, им требуются библиотеки типов.

Интересный угловой случай навсегда - язык С++/CLI. Он принял множество синтаксических правил Си ++, включая возможность опускать имена параметров в объявлениях. Другими словами, это законно:

    public interface class IFoo
    {
        void bar(int, long, double);
    };

Экспонент-экспортер библиотеки типов генерирует это объявление:

    HRESULT bar(
                    [in] long p1, 
                    [in] long p2, 
                    [in] double p3);

Очень похожий результат, если вы реализуете интерфейс в классе С#, как автогенерируется IntelliSense:

class FooImpl : cpptemp36.IFoo {
    public void foo(int __p1, int __p2, double __p3) {
        throw new NotImplementedException();
    }
}

Это никого не радует.

Ответ 3

Я бы предположил, что это связано с функцией названных параметров в С#. Т.е. вам нужно указать параметры по имени, а не только по порядку по умолчанию:

IActivityDao dao;
dao.GetAllSinceSequence(count: 1, sequence: 2);

Конечно, имена параметров были бы разными, если объект был выбран как ваш экземпляр.

var concreteDao = (ActivityDao) dao;
concreteDao.GetAllSinceSequence(maxRecords: 1, sequence: 2);

Ответ 4

Позвольте мне спросить вас об этом, есть ли где-нибудь еще в инфраструктуре .net, которая позволяет вам определять сигнатуру метода без имен параметров?

В конце концов все возможно, но большинство вещей есть по какой-то причине, в этом случае я бы предположил, что это предел структуры и дизайна компилятора, и действительно ли это имеет значение?

Вы все-таки определяете контракт на использование, можно было бы ожидать, что они действительно будут там.

Ответ 5

Многие языки, такие как С# и VB, поддерживают имена и аргументы параметров для методов. Без имен аргументов в интерфейсе использование имен и необязательных аргументов было бы невозможным. Именование аргументов также помогает читателю понять намерения и функции интерфейса.