没有从“ TKey”到“ System.IEquatable”的装箱转换或类型参数转换

时间:2019-06-28 10:30:04

标签: c# generics

我有以下代码

    public abstract class BaseEntity<TKey> : IIdentifiable<TKey>
    {
        public TKey Id { get; set; }
    }

    public interface IIdentifiable<TKey> where TKey : IEquatable<TKey>
    {
        TKey Id { get; set; }
    }

这会在BaseEntity上生成一条漂亮的错误消息

  

错误CS0314无法将类型“ TKey”用作类型参数“ TKey”   在通用类型或方法“ IIidentifiable”中。没有   装箱转换或将类型参数从“ TKey”转换为   'System.IEquatable'

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

如错误消息中所示:

There is no boxing conversion or type parameter conversion from 'TKey' to 'System.IEquatable'

在抽象类级别再次指定约束将解决此问题:

    public abstract class BaseEntity<TKey> : IIdentifiable<TKey> where TKey : IEquatable<TKey>
{
    public TKey Id { get; set; }
}

public interface IIdentifiable<TKey> where TKey : IEquatable<TKey>
{
    TKey Id { get; set; }
}

那是因为抽象类中的Tkey与接口中的TKey不同,因此您应该再次指定约束以使其具有相同的装箱类型。

例如,此代码也将有效:

public abstract class BaseEntity<TKey2> : IIdentifiable<TKey2> where TKey2 : IEquatable<TKey2>
{
    public TKey2 Id { get; set; }
}

public interface IIdentifiable<TKey> where TKey : IEquatable<TKey>
{
    TKey Id { get; set; }
}