给定下面的接口和类型,我想为PartyDao提供一个接口:
public interface IPartyDao<IdT> : IDao<Party<IdT>> where IdT : struct{}
我不能这样做,因为编译器认为一个Party不能转换成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
{
//..
}
最佳答案
将界面更改为:
public interface IPartyDao<IdT> : IDao<Party<IdT>, IdT>
where IdT : struct { }
它将编译。
您在此处发布的代码没有第二个通用参数传递给
IDao
。为了得到该错误,您看到需要传递
IdT
以外的类型作为第二个通用参数。如果您通过了int
(以消除第一个编译器错误),则该错误将是您无法将Party<IdT>
转换为EntityWithTypedId<int>
。这些类型的泛型参数需要匹配(因为它们的泛型参数既不协变也不相反)。