2010-08-27 39 views
5

在C#4.0出来之前,我对协变和逆变很兴奋。它让我喜欢理论上的正确性!但是,现在它已经出来了,我又回到了编写普通的,日常的,无聊的代码,我开始怀疑:我曾经使用过它吗?我注意到我没有有意识地使用它。我自己定义的接口或代表都没有从中受益。C#4.0中协变和反变换的真实用例的实例?

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

if (enumerableOfYs.Contains(variableOfTypeX)) 

是否有任何地方你们都使用协方差或逆变在现实生活中,不做作的使用 - 任何有趣的或令人振奋的例子并通过惊人的“正确”而真正拯救了这一天?

+5

你的意思是除了像IEnumerable ','Func'和'IComparable '你可能每天都在使用而不知道它吗? – Gabe 2010-08-27 05:10:52

回答

8

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

这真的不是“节省一天”的功能。这更像是“它按我期望的方式工作”的功能。

+0

嗨,埃里克。感谢您的回答。然而,这引出了一个更普遍的问题:C#团队如何优先考虑功能?为什么没有“保存一天”的功能比那些能够“保存一天”的功能得到更多的优先级,并且还让事情“按照我期望的方式工作”? (例如通用自定义属性,匿名迭代器块等) – Timwi 2010-08-29 07:41:40

+3

@Timwi:我们根据一长串竞争标准优先考虑特性,包括实施难度,与其他特性协同工作或与其他特性协同工作的因素,是否适合更广泛的发布主题等等。差异很容易;我们知道如何实施它,它已经在CLR中得到了支持,我们理解得非常好,并且消除了一直在报道的真正的客户问题。一个更大的特征将会带走太多的资源,从而进行“动态”工作,这是发布的高阶位。 – 2010-08-29 14:16:17

+0

我认为“它更像是一种”,它的工作方式与我期望它的“特色”是它非常有用的关键。 – 2010-09-29 10:36:51

1

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

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

+0

嗯,我不同意。 C++中的Const是一个限制。协变/逆变是相反的,它是一种额外的能力。 – Timwi 2010-08-27 05:11:29

+0

@Timwi,是的,这是一个很好的观点。它确实增加了很多价值。我错了。 – tster 2010-08-27 05:20:16

0

我用C#大约三年,我只记得曾经“失踪”方差一次或两次,也许特征。

现在有可能他们在语言中,我会发现更多的机会来利用它们,但我认为它们至多是'次要'功能。

(我很感兴趣,看看别人的答案出现在这里。)

3

我通过埃里克利珀,该功能的设计者之一观看优秀的两部分组成的系列影片的协方差和逆变。这些视频包含了我可以找到的特征如何运作的最清晰的解释;然而,这个例子是为演示而设计的。

我特别欣赏埃里克的讨论,在第二视频结束约他预计用户将使用该功能。他表示,大多数业务线应用程序开发人员可能不会创建许多采用协变或逆变的界面,但它更可能是框架开发人员(当然包括您自己的框架)的角色。另一方面,我终于可以将一个IEnumerable<DerivedClass>放入一个方法中,期望IEnumerable<BaseClass>而不用跳过类型铸造箍。最终,我可能会忘记我无法做到。我认为这将是最引人注目和常见的协变/逆变用法:超微妙的东西,只是工作当在早期版本的.NET中,他们没有。