【发布时间】:2011-11-19 20:01:42
【问题描述】:
如果一个人正在设计像ILookup 这样的界面(为简单起见,假设它只是ICheckIfContained,因此项目值的类型无关紧要),相对于第一个,理想的方差类型是什么参数?
检查ICheckIfContained<Animal> 是否包含特定的Cat 是一种自然操作,并且在正常的逆变规则下是类型安全的。
检查ICheckIfContained<Cat> 是否包含特定的Animal 在正常的逆变规则下不是类型安全的,但会是自然且明确定义的(如果有问题的Animal 不是@987654328 @,正确的行为是 ICheckIfContained 说它不包含有问题的动物)。
检查ICheckIfContained<Cat> 是否包含特定的Dog 不会特别有用(答案总是“否”),但答案会很明确。请注意,此场景中的答案与前一个不同,可以静态确定。
一种方法是让ICheckIfContained 成为非通用接口,并简单地接受Object 类型的参数。然而,在列表只包含单一类型的结构的情况下,这似乎相当低效。另一方面,如果它是一个泛型接口,那么编译器将无法允许它在协变场景中使用(传入一个其声明类型是预期类型的父级的参数,这样传入的对象可能或可能不是预期的类型)。
在编译器可以确认所有内容都是相同类型的情况下,有没有什么好的模式可以提高泛型的效率,同时仍然允许检查父类型的对象是否在集合中的一般情况行为子类型?
【问题讨论】:
-
有了这种代表,我希望您知道如何格式化问题中的代码。学习使用反勾号`。
-
啊,谢谢。我知道
backtick在 cmets 中工作,但我并没有想到它也可以在问题/答案中工作,因为问题使用 HTML(如 )来表示 bold i> 在答案中使用标点符号(星号,在粗体的情况下)处理。我认为在问题/答案中应该使用 之类的东西,尽管 TT 标记在这里特别不起作用。
标签: .net generics covariance contravariance