2012-03-04 4 views
2

У меня есть интерфейс:Рroblem с родовыми интерфейсов

interface IKey<TId, TName> 
    where TId: IEquatable<TId> 
    where TName: IEquatable<TName> 
{ 
    TId Id { get; set; } 
    TName Name { get; set; } 
} 

Тогда я реализовать Айки, как это:

class Item : IKey<int, string> 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
    //... 
} 

И у меня есть полуботинки, которые должны работать с этими элементами

class ItemCollection<T> 
    where T : IKey<TId, TName> //Any type that implements IEquatable<...> 
    where TId: IEquatable<TId> 
    where TName: IEquatable<TName> 
{ 
    //... 
} 

И проблема в том, что она не работает. Есть ли способ, которым я могу сделать это правильно?

Существует еще одна реализация Whithout IEquatable, используя IKey<out TId, out TName> и IKey<object, object>, но он не работает с ценностными типами и использует Object.Equals.

ответ

6

Проблема: вы пытаетесь использовать TId и TName в ItemCollection, не определяя их. Поскольку они являются частью ограничения интерфейса на T, они должны быть либо конкретными, либо типами параметров.

class ItemCollection<T, TId, TName> 
    where T : IKey<TId, TName> 
    where TId : IEquatable<TId> 
    where TName : IEquatable<TName> 
{ 
    //... 
} 

Пример использования жестко закодированные типов

class ItemCollection<T> 
    where T : IKey<string, string> 
{ 
    //... 
} 
Смежные вопросы