6

在 C# 4.0 出来之前,我对协变和逆变非常兴奋。它迎合了我对理论正确性的喜爱!

然而,现在它已经发布了,我又开始编写普通的、日常的、无聊的代码,我开始怀疑:我曾经使用过它吗?我注意到我没有有意识地使用它。从那以后,我定义的所有接口或委托都没有从中受益。

只有一个案例我后来发现我无意中使用了协方差,但它非常微妙,我也可能没有注意到它。ImagineX是一个基类并且Y是它的后代:

if (enumerableOfYs.Contains(variableOfTypeX))

有没有任何有趣或令人兴奋的例子,你们中的任何人在现实生活中使用协变或逆变,非人为的用例,并且通过惊人的“正确”真正拯救了一天?

4

4 回答 4

9

我在实际为客户编写程序(而不是编写编译器测试用例或文章或其他任何东西)中遇到的唯一“现实世界”使用方差是我现在可以将 an 传递IEnumerable<TypeParameterDefinedInSource>给一个期望IEnumerable<TypeSymbol>当我用 C# 编写代码分析工具时。

这真的不是一种“拯救世界”的功能。它更像是一个“它按我期望的方式工作”的功能。

于 2010-08-29T05:37:24.090 回答
3

我观看了 Eric Lippert(该功能的设计者之一)关于协变和逆变的出色的两部分视频系列。这些视频包含我能找到的关于该功能如何工作的最清晰的解释;但是,这些示例是为演示而设计的。

我特别感谢 Eric 在第二个视频结尾处关于他预计用户何时会使用该功能的讨论。他指出,大多数业务线应用程序开发人员可能不会创建许多使用协变或逆变的接口,但更有可能是框架开发人员的角色(当然包括您自己的框架)。

另一方面,我终于可以将 anIEnumerable<DerivedClass>放入一个期望 an 的方法中,IEnumerable<BaseClass>而无需自己跳过类型转换箍。最终,我可能会忘记我曾经做不到。我认为这将是协变/逆变最引人注目和最常见的用法:在早期版本的 .NET 中不起作用的超微妙事物。

于 2010-08-28T14:20:01.077 回答
1

协变和逆变之类的特性并不能真正“拯救世界”。相反,如果使用得当,它们会使以后的维护更容易。这样,它很像 C++ 中的 const 正确性。它不会增加任何功能,但正确编写的代码会使用它,并且使系统更易于使用。

注意:我还没有使用它,因为我刚刚升级到 VS 2010。

于 2010-08-27T05:09:13.250 回答
0

我使用 C# 大约三年,我只记得曾经“丢失”的方差特征可能只有一两次。

有可能现在它们在语言中,我会找到更多利用它们的机会,但我确实认为它们充其量只是“次要”功能。

(我很想看看这里出现的其他答案。)

于 2010-08-27T05:35:26.157 回答