我有一个界面:
interface IKey<TId, TName>
where TId: IEquatable<TId>
where TName: IEquatable<TName>
{
TId Id { get; set; }
TName Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我像这样实现IKey:
class Item : IKey<int, string>
{
int Id { get; set; }
string Name { get; set; }
//...
}
Run Code Online (Sandbox Code Playgroud)
我有可以使用这些项目的集合
class ItemCollection<T>
where T : IKey<TId, TName> //Any type that implements IEquatable<...>
where TId: IEquatable<TId>
where TName: IEquatable<TName>
{
//...
}
Run Code Online (Sandbox Code Playgroud)
问题是它不起作用.有没有办法可以正确地做到这一点?
还有另一个实现IEquatable,使用IKey<out TId, out TName>和IKey<object, object>但它不适用于值类型和用途Object.Equals.
问题是你试图使用TId,并TName在ItemCollection没有定义过他们.因为它们是接口约束的一部分,T它们需要将具体类型指定为类型参数.
class ItemCollection<T, TId, TName>
where T : IKey<TId, TName>
where TId : IEquatable<TId>
where TName : IEquatable<TName>
{
//...
}
Run Code Online (Sandbox Code Playgroud)
使用硬编码类型的示例
class ItemCollection<T>
where T : IKey<string, string>
{
//...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |