通用接口在C#中不起作用的问题

时间:2012-03-04 07:12:53

标签: c# generics

我有一个界面:

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

然后我像这样实施IKey:

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>
{
    //...
}

问题是它不起作用。有没有办法可以正确地做到这一点?

使用IEquatableIKey<out TId, out TName>进行了IKey<object, object>的另一个实现,但它不适用于值类型并使用Object.Equals

1 个答案:

答案 0 :(得分:6)

问题是您尝试在TId中使用TNameItemCollection而未定义它们。因为它们是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>
{
    //...
}