我有一个界面:
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>
{
//...
}
问题是它不起作用。有没有办法可以正确地做到这一点?
使用IEquatable
和IKey<out TId, out TName>
进行了IKey<object, object>
的另一个实现,但它不适用于值类型并使用Object.Equals
。
答案 0 :(得分: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>
{
//...
}