如果设计一个像ILookup
这样的界面(为简单起见,假设它只是ICheckIfContained
,那么项目值的类型无关紧要),理想的方差类型是什么?尊重第一个参数?
检查ICheckIfContained<Animal>
是否包含特定Cat
将是一种自然操作,并且在正常的逆变规则下是类型安全的。
检查ICheckIfContained<Cat>
是否包含特定Animal
在正常的逆向规则下是不是类型安全的,但是自然且定义明确(如果Animal
in问题不是Cat
,正确的行为是ICheckIfContained
说它不包含有问题的动物。
检查ICheckIfContained<Cat>
是否包含特定Dog
并不是特别有用(答案总是“不”),但答案是明确定义的。请注意,此方案中的答案与前一个案例不同,可以静态确定。
一种方法是将ICheckIfContained
作为非泛型接口,并简单地接受Object
类型的参数。但是,如果列表只包含单一类型的结构,那么这似乎效率很低。另一方面,如果它是通用接口,那么编译器将无法允许在协变场景中使用它(传入一个参数,其声明的类型是期望类型的父类,这样传入的对象可能或者可能不是预期的类型。)
在编译器可以确认所有内容都是相同类型的情况下,是否有任何很好的模式可以获得泛型的效率,同时仍然允许检查父类型的对象是否在集合中的一般情况行为孩子类型?
答案 0 :(得分:0)
我认为你不能那样做。能够将此静态检查为false肯定是有效的,但只有当编译器确切知道此方法执行的操作类型时,才能优化将Dog
传递给Contains(cat)
。
如果您的Contains
实际上是Add
怎么办?编译器不理解方法名称。