3

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

1 回答 1

2

C# 规范的第 13.4.2 节

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

所以答案是:不。即使存在诸如 之类的类型约束T : !U,它也会被忽略,并且您仍然会遇到相同的冲突。

于 2014-10-28T21:50:34.650 回答