C# 协变与抗变详解
-------------------------------------------------Animal.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication2{publicclassAnimal{}}
-------------------------------------------------Dog.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication2{publicclassDog:Animal{}}
-------------------------------------------------IOut.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication2{publicinterfaceIOut<outT>//协变{TXb();//T只能作为返回值}}
-------------------------------------------------IIn.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication2{publicinterfaceIIn<inT>//抗变{voidKb(Tt);//T只能作为参数}}
-------------------------------------------------ListOutIn.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication2{publicclassListOutIn<T>:IOut<T>,IIn<T>{publicTXb(){thrownewNotImplementedException();}publicvoidKb(Tt){thrownewNotImplementedException();}}}
-------------------------------------------------主程序
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication2{classProgram{staticvoidMain(string[]args){//out-->协变-->输出-->隐式转换//in-->抗变-->输入-->显示转换//协变IOut<Animal>oa=newListOutIn<Animal>();IOut<Dog>od=newListOutIn<Dog>();oa=od;//因为接口是协变的,隐式转换成功//抗变IIn<Animal>ia=newListOutIn<Animal>();IIn<Dog>id=newListOutIn<Dog>();id=ia;//因为接口是抗变的,显示转换成功}}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。