Частичное применение дженериков для ограничений типа

В настоящее время я пытаюсь создать общий интерфейс, в котором каждый (общий) класс, производный от него, будет иметь метод, принимающий делегата, который принимает параметр типа и возвращает другой класс того же типа, только с другим параметром типа.

Я пробовал следующее:

public interface GenericInterface<out T, out SomeDerived>
    where SomeDerived<T> : GenericInterface<T, SomeDerived>
{
    SomeDerived<NT> bind<NT>(bindee<T, NT, SomeDerived<NT>> bindFunc);
}

public delegate AnotherDerived<T2> bindee<in T1, out T2, out AnotherDerived>(T1 param)
    where AnotherDerived<T2> : GenericInterface<T2, AnotherDerived>;

public class Derived<T> : GenericInterface<T, Derived>
{
    Derived<NT> bind<NT>(bindee<T, NT, Derived<NT>> bindFunc);
}

Но он не компилируется, и я получаю эту ошибку:

Недопустимый токен '‹' в объявлении члена класса, структуры или интерфейса.

Какая правильная конструкция в таком случае?

РЕДАКТИРОВАТЬ:

Я понимаю синтаксическую причину ошибок компилятора. Вы не можете применить аргумент универсального типа к параметру в предложении where. Я спрашиваю, как лучше всего имитировать такое поведение.


person Itay    schedule 14.09.2013    source источник
comment
Не могли бы вы показать нам эту странную ошибку - полную и полную ошибку со всеми подробностями, пожалуйста.   -  person marc_s    schedule 14.09.2013
comment
ну, может быть, странный - неправильный термин ... Компилятору не нравится иметь ‹› в спецификации where   -  person Itay    schedule 14.09.2013
comment
Недействительный токен '‹' в объявлении члена класса, структуры или интерфейса; Недействительный токен «› »в объявлении члена класса, структуры или интерфейса; Недействительный токен '{' в объявлении члена класса, структуры или интерфейса; Синтаксическая ошибка: ожидается   -  person Itay    schedule 14.09.2013
comment
Хорошо, теперь также укажите в коде ГДЕ, где вы получаете эту ошибку!   -  person marc_s    schedule 14.09.2013
comment
Я согласен с marc_s, вопросы должны описывать конкретную проблему   -  person Sayse    schedule 14.09.2013
comment
SomeDerived<T> синтаксически неверен в том, где ограничение   -  person Sriram Sakthivel    schedule 14.09.2013
comment
Подождите ... вы хотите, чтобы у универсального типа был параметр типа сам по себе? Умопомрачительный ...   -  person Meirion Hughes    schedule 14.09.2013


Ответы (1)


Я рискну здесь и скажу, что то, что вы пытаетесь сделать здесь с помощью Generic, невозможно; Удаляю, если кто-то сочтет, что я не прав.

Итак, начнем с этого

interface IFoo<T> where T : IFoo<T>{}
class Foo<T> : IFoo<T> where T : IFoo<T>{}
class Bar<T> : Foo<T> where T : IFoo<T>{}

Давайте попробуем создать экземпляр этого;

var foo = new Foo< Bar< ....errr what now? ad infinitum... 

Итак, чтобы исправить это, вам нужно изменить дизайн, чтобы ваши классы выглядели примерно так:

interface IBase {}
interface IFoo<out T> where T : IBase { }
class Foo<T> : IFoo<T> where T : IBase { }

что затем позволяет:

IFoo<IBase> foo = new Foo<Base>();

[Приложение]

У вас могут быть универсальные шаблоны функционального уровня, которые позволят вам обойти подобные проблемы ...

interface IFoo<out T> where T : IBase
{
    IFoo<TBind> Bind<TBind>(Action<T, TBind> bindFunc) where TBind : IBase;
}
person Meirion Hughes    schedule 14.09.2013