【问题标题】:Examples of good, real-life use-cases for covariance and contravariance in C# 4.0?C# 4.0 中协变和逆变的良好真实用例示例?
【发布时间】:2010-08-27 05:05:06
【问题描述】:

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

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

只有一个单一的情况,我后来发现我无意中使用了协方差,但它非常微妙,我也可能没有注意到它。想象X 是一个基类,Y 是它的后代:

if (enumerableOfYs.Contains(variableOfTypeX))

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

【问题讨论】:

  • 您的意思是除了IEnumerable<T>FuncIComparable<T> 之类的东西,您可能每天都在不知不觉中使用它?

标签: c# covariance use-case contravariance


【解决方案1】:

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

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

【讨论】:

  • 嗨,埃里克。感谢您的回答。不过,这让我想到了一个更普遍的问题:C# 团队如何优先考虑功能?为什么一个不能“拯救世界”的功能比那些“拯救世界”并且让事情“发挥作用”的功能获得如此多的优先级?我希望他们怎么做”? (例如通用自定义属性、匿名迭代器块等)
  • @Timwi:我们根据一长串竞争标准对功能进行优先级排序,包括实施难度、与其他功能配合或对抗其他功能的效果、是否适合发布的更广泛主题等因素, 等等。差异很容易;我们知道如何实现它,它已经在 CLR 中得到支持,我们非常了解这个理论,它消除了一直报告的真正客户问题。一个更大的功能会占用过多的资源来制作“动态”工作,而这是发布的高阶位。
  • 我认为“它更像是一个‘它以我期望的方式工作’的功能”是它如此有用的关键。
  • 方差的另一个很好的用途是使用接口,其中对象的方法将返回对象自身类型的某些内容(常见示例是克隆方法或 return-self-as-type 方法)。如果一个类实现了 ICloneable(Of DerivedType),它可以被期望 ICloneable(Of BaseType) 的东西自动调用,而不必为它处理的每个类型实现一个单独的 ICloneable(OfwhateverType)。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 嗯,我不同意。 C++ 中的 const 是一个限制。协变/逆变则相反,它是一种额外的能力。
    • @Timwi,是的,这是一个很好的观点。它确实增加了很多价值。我错了。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2012-04-06
      相关资源
      最近更新 更多