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

我有以下代码


    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”不能用作泛型类型或方法“IIdentifiable”中的类型参数“TKey”。没有从“TKey”到“System.IEquatable”的装箱转换或类型参数转换


我究竟做错了什么?


慕斯709654
浏览 166回答 1
1回答

芜湖不芜

如错误信息所示:There is no boxing conversion or type parameter conversion from 'TKey' to 'System.IEquatable'在抽象类级别再次指定约束将解决问题:&nbsp; &nbsp; public abstract class BaseEntity<TKey> : IIdentifiable<TKey> where TKey : IEquatable<TKey>{&nbsp; &nbsp; public TKey Id { get; set; }}public interface IIdentifiable<TKey> where TKey : IEquatable<TKey>{&nbsp; &nbsp; TKey Id { get; set; }}那是因为抽象类中的 Tkey 与接口中的 TKey 不同,因此您应该再次指定约束以使其成为相同的装箱类型。例如,此代码也将有效:public abstract class BaseEntity<TKey2> : IIdentifiable<TKey2> where TKey2 : IEquatable<TKey2>{&nbsp; &nbsp; public TKey2 Id { get; set; }}public interface IIdentifiable<TKey> where TKey : IEquatable<TKey>{&nbsp; &nbsp; TKey Id { get; set; }}
打开App,查看更多内容
随时随地看视频慕课网APP