-------------------------------------------------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;//因为接口是抗变的,显示转换成功}}}