2012-03-04 62 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> 
{ 
    //... 
} 

問題是它不起作用。有沒有一種方法可以正確地做到這一點?

有內部消除IEquatable另一種實現方式,使用IKey<out TId, out TName>IKey<object, object>但它不具有價值的工作類型和使用Object.Equals

回答

6

問題是您試圖在ItemCollection中使用TIdTName而沒有定義它們。因爲它們是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> 
{ 
    //... 
} 
實施例