.NET泛型类型约束不等式

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);
}

不,你不能自己编写语法。只需添加T Map(U source)方法即可。 - Hans Passant
1个回答

2

C#规范的第13.4.2节

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

所以答案是:不行。即使有像T :! U这样的类型约束,它也会被忽略,你仍然会遇到相同的冲突。


我想我应该将这个责任委托给具体的类,然后让它实现 IOneWayMapper<ConcreteType1, ConcreteType2>IOneWayMapper<ConcreteType2, ConcreteType1>。感谢您的帮助。对于其他人,该规范的链接是http://msdn.microsoft.com/en-us/library/aa664592(v=vs.71).aspx。 - trousyt
@TroyP。听起来是个合理的解决方案 :) - dcastro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接