.NET泛型类型约束不等式

时间:2014-10-28 21:44:53

标签: .net type-systems generic-constraints

我试图实现两个通用接口。 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);
}

1 个答案:

答案 0 :(得分:2)

C#规范的第13.4.2节

  

如果从C创建的任何可能的构造类型将类型参数替换为L后,导致L中的两个接口相同,则C的声明无效。 在确定所有可能的构造类型时不考虑约束声明。

所以答案是:不。即使存在类型约束(例如T : !U),它也会被忽略,并且您仍会遇到相同的碰撞。