给定下面的接口和类型,我想为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>。这些类型的泛型参数需要匹配(因为它们的泛型参数既不协变也不相反)。

10-07 20:02