微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,那么可能更容易阅读和维护.)

原文地址:https://www.jb51.cc/csharp/100459.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐