问题描述
什么是协方差和上溯造型,或者,之间的差异更确切地说,他们为什么要给予不同的名字呢?
我见过被称为向上转型下面的例子:
字符串s =你好;
对象o = S; //向上转型为'字符串'到'对象'
然而,下面我见过所谓的'协':
的String [] S =新的字符串[100];
[对象] O = S;IEnumerable的<串GT; IES =新的List<串GT;();
IEnumerable的<对象> IEO = IES;
现在,我的未经训练的眼,协方差似乎是一样向上转型,除了它是指集合的铸造。 (和类似的声明,可制成关于逆变和向下转换)。
是不是真的那么简单吗?
Covariance isn't about upcasting, although I can see why you think it's related.
Covariance is about the following very simple idea. Let's say you have a variable derivedSequence
of type IEnumerable<Derived>
. Let's say you have a variable baseSequence
of type IEnumerable<Base>
. Here, Derived
derives from Base
. Then, with covariance, the following is a legal assignment, and an implicit reference conversion occurs:
baseSequence = derivedSequence;
Note that this is not upcasting. It is not the case that IEnumerable<Derived>
derives from IEnumerable<Base>
. Rather, it is covariance that allows you to assign the value of the variable derivedSequence
to the variable baseSequence
. The idea is that variables of type Base
can be assigned from objects of type Derived
, and since IEnumerable<T>
is covariant in its parameter, objects of type IEnumerable<Derived>
can be assigned to variables of type IEnumerable<Base>
.
Of course, I haven't yet really explained what covariance is. In general, covariance is about the following simple idea. Let's say you have a mapping F
from types to types (I'll denote this mapping by F<T>
; given a type T
its image under the mapping F
is F<T>
.) Let's say that this mapping has the following very special property:
In this case, we say that F
is covariant in its parameter T
. (Here, to say that "A
is assignment compatible with B
" where A
and B
are reference types means that instances of B
can be stored in variables of type A
.)
In our case, IEnumerable<T>
in C# 4.0, an implicit reference conversion from instances of IEnumerable<Derived>
to IEnumerable<Base>
if Derived
is derived from Base
. The direction of assignment compatibility is preserved, and this is why we say that IEnumerable<T>
is covariant in its type parameter.
这篇关于协方差和上溯造型的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!