温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C# 协变与抗变详解

发布时间:2020-08-06 06:47:13 来源:网络 阅读:1689 作者:1473348968 栏目:编程语言

-------------------------------------------------Animal.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 {     public class Animal     {     } }

-------------------------------------------------Dog.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 {     public class Dog:Animal     {     } }

-------------------------------------------------IOut.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 {     public interface IOut<out T>//协变     {         T Xb();//T 只能作为返回值     } }

-------------------------------------------------IIn.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 {     public interface IIn<in T>//抗变     {         void Kb(T t);//T 只能作为参数     } }

-------------------------------------------------ListOutIn.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 {     public class ListOutIn<T> : IOut<T>, IIn<T>     {         public T Xb()         {             throw new NotImplementedException();         }         public void Kb(T t)         {             throw new NotImplementedException();         }     } }

-------------------------------------------------主程序

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 {     class Program     {         static void Main(string[] args)         {             //out --> 协变--> 输出--> 隐式转换             //in  --> 抗变--> 输入--> 显示转换             //协变             IOut<Animal> oa = new ListOutIn<Animal>();             IOut<Dog> od = new ListOutIn<Dog>();             oa = od;//因为接口是协变的,隐式转换成功             //抗变             IIn<Animal> ia = new ListOutIn<Animal>();             IIn<Dog> id = new ListOutIn<Dog>();             id = ia;//因为接口是抗变的,显示转换成功         }     } }

 

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI