鑑於接口和下面的類型,我會喜歡有一個PartyDao接口:通用打字混亂
public interface IPartyDao<IdT> : IDao<Party<IdT>> where IdT : struct{}
因爲編譯器認爲一個締約方未兌換成EntityWithTypedId我不能這樣做。看一個黨的簽名,它似乎黨是一個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
{
//..
}
當編譯你的代碼時,我得到一個錯誤,指出'IDao'需要兩個泛型參數,而不是你描述的錯誤。 – Servy
另請注意,您在註釋中聲明'TId'可能是'string' - 'string'不是一個結構體,所以限制不會允許您爲'TId'使用'string'。 – Gjeltema
@Gjeltema。過時的文檔好地方! – Berryl