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

tuk*_*aef 2 c# generics

我有一个界面:

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.

Jar*_*Par 6

问题是你试图使用TId,并TNameItemCollection没有定义过他们.因为它们是接口约束的一部分,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)