1

鉴于下面的接口和类型,我想一个 PartyDao 的接口:

public interface IPartyDao<IdT> : IDao<Party<IdT>> where IdT : struct{}   

我不能这样做,因为编译器认为 Party 不能转换为 EntityWithTypedId。查看 Party 的签名,Party似乎是一个 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
{
    //..  
}
4

1 回答 1

5

将您的界面更改为:

public interface IPartyDao<IdT> : IDao<Party<IdT>, IdT> 
    where IdT : struct { }

它会编译。

您在此处发布的代码没有第二个通用参数传递给IDao.

为了得到你看到的错误,你需要传递一个类型而不是IdT第二个泛型参数。例如,如果您传递 an int(以消除第一个编译器错误),那么错误将是您无法将 a 转换Party<IdT>EntityWithTypedId<int>. 这些类型的泛型参数需要匹配(因为它们的泛型参数既不是协变的也不是逆变的)。

于 2013-07-10T16:49:48.480 回答