2013-09-14 6 views
0

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

Я попытался следующие:

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); 
} 

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

Invalid token '<' in class, struct, or interface member declaration

Что такое правильный дизайн в таком случае?

EDIT:

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

+2

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

+0

хорошо, возможно, странно, это не правильный термин ... Компилятор не любит иметь <> в спецификации «где» – Itay

+0

Недопустимый токен «<» в объявлении члена класса, структуры или интерфейса; Недопустимый токен '>' в объявлении класса, структуры или интерфейса; Недопустимый токен '{' в объявлении члена класса, структуры или интерфейса; Ошибка синтаксиса, ':' Ожидается – Itay

ответ

2

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

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

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; 
} 
Смежные вопросы