c# – 具有两个非相等(唯一)类型的泛型类
是否可以实现一个约束为两个唯一通用参数的类?
如果不是,那是因为它没有实现,还是因为语言结构(继承)是不可能的? 我想要一些形式: class BidirectionalMap<T1,T2> where T1 != T2 { ... } 我正在实施Bidirectional dictionary.这主要是好奇心问题,而不是需要. 从评论中解释: >丹:“如果不满足这种限制,会有什么负面后果?” 解决方法
扩展示例以突出显示问题:
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,那么可能更容易阅读和维护.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |