以下のインターフェイスとタイプを考えると、 PartyDao用のインターフェイスが必要です。
public interface IPartyDao<IdT> : IDao<Party<IdT>> where IdT : struct{}
コンパイラは Party を EntityWithTypedId に変換できないと考えているため、これを行うことはできません。Party の署名を見ると、Partyは EntityWithTypedId であるため、s/b は 1 つに変換可能であるように見えます。
コンパイラは常に正しいという事実に加えて、この場合はなぜ正しいのでしょうか? 修正はありますか?
不快感の多くは、少なくとも審美的には 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
{
//..
}