我试图实现两个通用接口。 ITwoWayMapper<T,U>
同时实现IOneWayMapper<T,U>
和IOneWayMapper<U,T>
是有道理的。所以,如果我尝试这样做:
public interface IOneWayMapper<T, U>
{
U Map(T source);
}
public interface ITwoWayMapper<T, U> :
IOneWayMapper<T, U>,
IOneWayMapper<U, T>
{
TTwo Map(TOne source);
TOne Map(TTwo source);
}
我收到错误Interface ITwoWayMapper<T,U> cannot implement both IOneWayMapper<T,U> and IOneWayMapper<U,T> because they may unify for some type parameter substitutions
。所以我认为,这是不明智的,因为它无法分辨哪个界面是满意的。
所以这引出了我的问题:是否可以使用类型约束来说出这样的内容?:
public interface ITwoWayMapper<T, U> :
IOneWayMapper<T, U>,
IOneWayMapper<U, T>
where T: !U
{
TTwo Map(TOne source);
TOne Map(TTwo source);
}
答案 0 :(得分:2)
C#规范的第13.4.2节
如果从C创建的任何可能的构造类型将类型参数替换为L后,导致L中的两个接口相同,则C的声明无效。 在确定所有可能的构造类型时不考虑约束声明。
所以答案是:不。即使存在类型约束(例如T : !U
),它也会被忽略,并且您仍会遇到相同的碰撞。