【问题标题】:There is no boxing conversion or type parameter conversion from 'TKey' to 'System.IEquatable'没有从“TKey”到“System.IEquatable”的装箱转换或类型参数转换
【发布时间】:2019-07-02 17:53:21
【问题描述】:

我有以下代码

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

我做错了什么?

【问题讨论】:

  • 再次读取异常信息。现在写这个:public abstract class BaseEntity&lt;TKey&gt; : IIdentifiable&lt;TKey&gt; where TKey : IEquatable&lt;TKey&gt;
  • 哦,是的。对不起。不过谢谢你的帮助

标签: c# generics


【解决方案1】:

如报错信息所示:

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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    相关资源
    最近更新 更多