|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
据说很厉害,甚至可以把C#也干掉^_^,不过也很复杂,本来C++已经够复杂的。有人甚至还提出把这个东东引进标准,我觉得基本上不可能的。逆变(contravariant)与协变(covariant)是C#4新增的观点,很多书本和博客都有解说,我以为都没有把它们讲分明,弄分明了它们,能够更正确地往界说泛型托付和接口,这里我实验绘图具体剖析逆变与协变。
变的观点
我们都晓得.Net里大概说在OO的天下里,能够平安地把子类的援用赋给父类援用,比方:
1
2
3
//父类=子类
stringstr="string";
objectobj=str;//变了
而C#里又有泛型的观点,泛型是对范例体系的进一步笼统,比下面复杂的范例初级,把下面的变更表现在泛型的参数上就是我们所说的逆变与协变的观点。经由过程在泛型参数上利用in或out关头字,能够失掉逆变或协变的才能。上面是一些对照的例子:
协变(Foo<父类>=Foo<子类>):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//泛型托付:
publicdelegateTMyFuncA<T>();//不撑持逆变与协变
publicdelegateTMyFuncB<outT>();//撑持协变
MyFuncA<object>funcAObject=null;
MyFuncA<string>funcAString=null;
MyFuncB<object>funcBObject=null;
MyFuncB<string>funcBString=null;
MyFuncB<int>funcBInt=null;
funcAObject=funcAString;//编译失利,MyFuncA不撑持逆变与协变
funcBObject=funcBString;//变了,协变
funcBObject=funcBInt;//编译失利,值范例不介入协变或逆变
//泛型接口
publicinterfaceIFlyA<T>{}//不撑持逆变与协变
publicinterfaceIFlyB<outT>{}//撑持协变
IFlyA<object>flyAObject=null;
IFlyA<string>flyAString=null;
<p>IFlyB<object |
|