c# – 具有两个非相等(唯一)类型的泛型类

是否可以实现一个约束为两个唯一通用参数的类?

如果不是,那是因为它没有实现,还是因为语言结构(继承)是不可能的?

我想要一些形式:

class BidirectionalMap<T1,T2> where T1 != T2
{
  ...
}

我正在实施Bidirectional dictionary.这主要是好奇心问题,而不是需要.

评论中解释:

>丹:“如果不满足这种限制,会有什么负面后果?”
>我:“然后用户可以使用map [t1]和map [t2]进行索引.如果它们是相同的类型,则没有任何区别,也没有任何意义.”
> Dan:编译器实际上允许[两个泛型类型参数来定义不同的方法重载],所以我很好奇;它是否随意选择一种方法调用

解决方法

扩展示例以突出显示问题:
public class BidirectionalMap<T1,T2>
{
    public void Remove(T1 item) {}
    public void Remove(T2 item) {}

    public static void test()
    {
        //This line compiles
        var possiblyBad = new BidirectionalMap<string,string>();

        //This causes the compiler to fail with an ambiguous invocation
        possiblyBad.Remove("Something");
    }
}

所以答案是,即使你不能指定约束T1!= T2,也没关系,因为一旦你尝试做违反隐式约束的事情,编译器就会失败.它仍然在编译时捕获失败,因此您可以使用这些重载而不受惩罚.这是一个有点奇怪,因为你可以在地图的一个实例(甚至可以编写适当地操纵地图IL代码),但C#编译器不会让你任意地解决模棱两可的重载肆虐.

一方面注意,如果你不小心,这种超载可能会导致一些奇怪的行为.如果您有BidirectionalMap< Animal,Cat>和Cat:Animal,考虑一下这段代码会发生什么:

Animal animal = new Cat();
map.Remove(animal);

这将调用占用Animal的重载,因此它会尝试删除一个键,即使您可能打算删除值Cat.这是一个有点人为的情况,但是当由于方法重载导致出现非常不同的行为时,它足以引起注意.在这种情况下,如果您只是给方法指定不同的名称,反映它们的不同行为(RemoveKey和RemoveValue,那么可能更容易阅读和维护.)

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...