是否可以实现一个约束为两个唯一通用参数的类?
如果不是,那是因为它没有实现,还是因为语言结构(继承)是不可能的?
我想要一些形式:
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,那么可能更容易阅读和维护.)