1

以下のインターフェイスとタイプを考えると、 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
{
    //..  
}
4

1 に答える 1