我有以下代码
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'
我在做什么错了?
答案 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; }
}