协方差与反方差之差

协方差与反方差之差

我很难理解协方差和反方差之间的区别。



慕容森
浏览 562回答 3
3回答

HUX布斯

给出例子可能是最简单的-这就是我记得它们的方式。协方差典型的例子:IEnumerable<out T>,&nbsp;Func<out T>您可以从IEnumerable<string>到IEnumerable<object>,或Func<string>到Func<object>..价值只会到来从这些东西。这是因为如果您只从API中提取值,并且它将返回特定的值(例如string),您可以将返回的值视为更一般的类型(如object).反方差典型的例子:IComparer<in T>,&nbsp;Action<in T>您可以从IComparer<object>到IComparer<string>,或Action<object>到Action<string>价值只会消失进这些东西。这一次它起作用了,因为如果api期望的是一些通用的东西(例如object)你可以给它一些更具体的东西(比如string).更一般如果你有一个接口IFoo<T>它可以是协变的T(即声明为IFoo<out T>如果T仅用于接口中的输出位置(例如返回类型)。它可以在T(即:IFoo<in T>)如果T仅用于输入位置(例如参数类型)。它可能会引起混淆,因为“输出位置”并不像听起来那么简单-一个类型的参数。Action<T>仍然只使用T在输出位置上Action<T>如果你明白我的意思。这是一个“输出”,因为这些值可以从方法的实现中传递走向调用者的代码,就像返回值一样。这类事情通常不会出现,幸运的是:)
打开App,查看更多内容
随时随地看视频慕课网APP