C#4.0中协方差和逆变的良好,真实用例的例子?

时间:2010-08-27 05:05:07

标签: c# covariance use-case contravariance

在C#4.0问世之前,我对协方差和逆变感到非常兴奋。它迎合了我对理论正确性的喜爱!

然而,现在它已经出来了,我又回到了写正常,日常,无聊的代码,我开始怀疑:我曾经使用它吗?我注意到我并没有有意识地使用它。我之后定义的接口或代理都没有从中受益。

只有一个单个案例,我后来发现我在不知不觉中使用了协方差,但它非常微妙,我也没有注意到它。想象一下X是一个基类,Y是它的后代:

if (enumerableOfYs.Contains(variableOfTypeX))

有没有任何有趣或令人兴奋的例子,你们中的任何一个人在现实生活中,非人为的用例中使用了协方差或逆变,它真的通过非常“正确”来挽救了这一天?

4 个答案:

答案 0 :(得分:9)

我在实际的客户编写程序(与编写编译器测试用例或文章或其他任何东西相反)中遇到的唯一“现实世界”方差的使用是我现在可以通过{{1我在C#中编写代码分析工具时需要IEnumerable<TypeParameterDefinedInSource>的方法。

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

答案 1 :(得分:3)

我观看了由该功能设计师之一Eric Lippert撰写的关于协方差和逆变的优秀的两部分视频系列。这些视频包含了我能找到的关于该功能如何工作的最清晰的解释;然而,这些例子都是为了演示而设计的。

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

另一方面,我最终可以将IEnumerable<DerivedClass>放入期望IEnumerable<BaseClass>的方法中,而不是自己跳过类型投掷箍。最终,我可能会忘记我曾经做不到。我认为这将是协方差/逆变的最引人注目和最常见的用法: 只是工作 的超级微妙的东西,在早期版本的.NET中,它们没有

答案 2 :(得分:1)

协方差和逆变等特征并不能真正“拯救一天”。相反,如果使用得当,它们可以使以后的维护更容易。这样,它就像C ++中的const正确性一样。它不会增加任何功能,但正确编写的代码使用它,它使系统更容易使用。

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

答案 3 :(得分:0)

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

现在他们可能会使用这种语言,我会发现更多机会利用它们,但我认为它们充其量只是'次要'。

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