Универсальные интерфейсы - PullRequest
       37

Универсальные интерфейсы

6 голосов
/ 30 января 2010

Вот мой код

public interface ITranslator<E, R>
{       
    E ToEntity<T>(R record);
}

class Gens : ITranslator<string, int>
{
    #region ITranslator<string,int> Members

    public string ToEntity<MyOtherClass>(int record)
    {
        return record.ToString();
    }

    #endregion
}

Когда я компилирую это, я получаю ошибку Type parameter declaration must be an identifier not a type

Почему я не могу иметь ToEntity<MyOtherClass>, но могу иметь только ToEntity<T> ??

Редактировать: что делает MyOtherClass? Я конвертирую между сущностями (POCO, эквивалентными Entity Framework) и записью (Object, возвращаемой платформой) для нескольких таблиц / классов. Поэтому я бы хотел использовать это для конвертации своего класса

Ответы [ 3 ]

9 голосов
/ 30 января 2010

В вашем интерфейсе есть общий ToEntity<T> метод, который вы сделали неуниверсальным в своем классе реализации Gens как ToEntity<MyOtherClass>. (Метод универсальный может принимать любой параметр типа, возможно, с учетом определенных ограничений на T. Ваш класс Gens пытается предоставить определение для ToEntity только для параметра типа MyOtherClass, что побеждает назначение дженериков.)

В вашем примере кода неясно, как ваш класс Gens пытается использовать тип MyOtherClass; это, конечно, не связано с логикой ToEntity. Нам нужно больше информации, чтобы мы могли вести вас дальше.

Чтобы проиллюстрировать, вот что предлагает ваше текущее определение интерфейса ITranslator<E, R> на простом английском языке:

«Я предоставляю механизм для перевода любая запись типа R в сущность типа E, этот механизм является зависит от любого указанного пользователем типа T. "

Ваш класс Gens, с другой стороны, в том виде, в котором он в настоящее время разработан, «реализует» вышеуказанный интерфейс следующим образом:

"Я могу перевести целые числа в строки. Я предоставляю иллюзию разрешения пользователь, чтобы указать тип для управления как этот перевод выполняется, но на самом деле нет выбора типа. Класс MyOtherClass участвует как-то; это все, что я могу сказать. "

Из этих двух описаний ясно, что класс Gens на самом деле не делает то, что интерфейс ITranslator<E, R> гарантирует . А именно, он не желает принимать указанный пользователем тип для своего метода ToEntity. Вот почему этот код не скомпилируется для вас.

2 голосов
/ 30 января 2010

Вы должны объявить ограничение для универсального типа.

public string ToEntity<T>(int record) where T : MyOtherClass
1 голос
/ 30 января 2010

Это нормально для меня в LINQpad. Может быть, у вас есть тип с именем E, R или T где-нибудь?

Ааа, я вижу, что вы пытаетесь сделать ... у вас MyOtherClass определен где-то как класс, но вы пытаетесь использовать его в качестве аргумента типа в ToEntity. Как именно вы хотите, чтобы MyOtherClass участвовал в ToEntity?

...