鉴于下面的接口和类型,我想有一个 PartyDao 的接口:
public interface IPartyDao<IdT> : IDao<Party<IdT>> where IdT : struct{}
我不能这样做,因为编译器认为 Party 不能转换为 EntityWithTypedId。查看 Party 的签名,Party似乎是一个 EntityWithTypedId,因此可以 s/b 转换为一个。
除了编译器总是正确的事实之外,为什么在这种情况下它是正确的?有解决办法吗?
至少在美学上,大部分的讨厌都来自使用 IdT,但是
// IdT is just the id, usually either an int or Guid
//
public interface IEntityWithTypedId<out TId> where TId : struct
{
TId Id { get; }
}
// base impl
public abstract class EntityWithTypedId<TId> : IEntityWithTypedId<TId> where TId:struct
{
//..
}
// Party *IS* of the right lineage
public class Party<IdT> : EntityWithTypedId<IdT> where IdT : struct
{
//..
}
//
public interface IDao<T, in IdT>
where T : EntityWithTypedId<IdT>
where IdT : struct
{
//..
}