加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

(来源) in:对于泛型类型参数

发布时间:2016-10-29 02:06:48 所属栏目:教程 来源:站长网
导读:副标题#e# 既不能协变,详细下面再做说明, out Tout(Tin obj);MyFuncstring, 延长思索 为什么in[输入参数]就只能逆变?说明如下: // 人public class People { }//先生(担任People[人])public class Teacher : People{ //薪水 public decimal Salary { ge
副标题[/!--empirenews.page--]

既不能协变,详细下面再做说明, out Tout(Tin obj);MyFuncstring, 延长思索 为什么in[输入参数]就只能逆变?说明如下: // 人public class People { }//先生(担任People[人])public class Teacher : People{ //薪水 public decimal Salary { get; set; }}//行为public interface IMotionin T{ void Match(T t);}//跑步public class RunT : IMotionT{ public void Match(T t) { //假设中间有许多逻辑..... }} 为什么out[返回值]只能协变?说明如下: // 人public class People { }//先生(担任People[人])public class Teacher : People{ //薪水 public decimal Salary { get; set; }}//行为public interface IMotionout T{ T Show(); //void Match(T t);}//跑步public class RunT : IMotionT{ public T Show() { return default(T); } //public void Match(T t) //{ // //假设中间有许多逻辑..... /,可以在泛型接口和委托中行使in要害字, 最后功效是:都不能用。

此为稳固体, 泛型委托的可变性 先行使框架界说的泛型委托Func和Action做例子(不相识的请戳) 协变:(string-object) Funcstring func1 = () = "农码生平";Funcobject func2 = func1; 逆变:(object-string) Actionobject func3 = t = { };Actionstring func4 = func3; 上面代码没有任何题目,我们必要修改泛型范例参数: 我们发明整个委托参数都变了,那么我们只能通过out、in来实现, 结论: in-输入参数-可逆变(父类到子类的转变[如object-string]) out-返回值-可协变(子类到父类的转变[如string-object]) 假设:假如泛型参数中既存在in又存在out改怎样: delegate Tout MyFuncin Tin, out Tout(Tin obj); MyFuncobject, string str5 = t = "农码生平";MyFuncobject,(来历) 那么我们可以修改自界说委托: 美满! 那假如我们要实现逆变性呢: 直接逆变是不行行的, 如(我们在IMotion界说两个要领): //行为public interface IMotionT{ T Show(); void Match(T t);} 上面我们测试过,我们也可以直接写成: IMotionTeacher y3 = new RunPeople(); 稳固性 从上面我们知道逆变性的代码编译后城市举办逼迫转换,在4.0及之后才支持。

我们既想有协变性又想逆变性,基于上面两种环境,看人不来哦,行使in时, 然后我们看看编译后的C#代码: 结论: 所谓的逆变着实只是编译后举办了逼迫范例转换罢了,没有任何题目!且还可以同时协变、逆变??差池,编译后同样举办了逼迫转换: 虽然。

假云云刻我们在泛型参数添加out或in属性会怎样?: 我们发明out和in都不能用,称为稳固性,有乐趣可以切换版本看看,,代码直接逼迫转换是不能实现协变、逆变的。

假设:那我们不消out、in直接办动逼迫转换是否可以?: // 人public class People { }//先生(担任People[人])public class Teacher : People { }//行为public interface IMotionT { }//跑步public class RunT : IMotionT { } //协变IMotionTeacher x = new RunTeacher();IMotionPeople y = (IMotionPeople)x;//逆变IMotionPeople x2 = new RunPeople();IMotionTeacher y2 = (IMotionTeacher)x2;IMotionTeacher y3 = (IMotionTeacher)new RunPeople(); 天才的我发明编译乐成了,不行变。

如:string-object (子类到父类的转换) 逆变性, 简述什么是协变性、逆变性、稳固性 协变性,改成输入参数才行。

out要害字指定该范例参数是协变的, string str1 = t = "农码生平";MyFuncstring,真的天才了吗?我们运行试试: 看来我照旧太纯真了。

可以在泛型接口和委托中行使out要害字,如:object-string (父类到子类的转换) 稳固性, object str3 = str1;//第二个泛型的协变(string-object)MyFuncstring,(来历) in:对付泛型范例参数, object str7 = t = "农码生平"; 泛型接口的可变性 接着看框架默认接口: 协变:(子类-父类) IEnumerablestring list = new Liststring();IEnumerableobject list2 = list; 逆变:(父类- 子类) IComparableobject list3 = null;IComparablestring list4 = list3; 接下来我们试试自定泛型接口: 起首界说测试范例、接口: // 人public class People{ }//先生(担任People[人])public class Teacher : People{ }//行为public interface IMotionT{ }//跑步public class RunT : IMotionT{ } 然后我们测试协变性: 同样我们必要把接口interface IMotionT界说为interface IMotionout T //行为public interface IMotionoutT{} IMotionTeacher x = new RunTeacher();IMotionPeople y = x; 假如我们要测试逆变性。

in要害字指定该范例参数是逆变的,为什么自界说的委托却不能协变呢,什么鬼: out:对付泛型范例参数。

这就会呈现第三种环境,则必要把interface IMotionT 界说为interface IMotionin T //行为public interface IMotionin T{} IMotionPeople x2 = new RunPeople();IMotionTeacher y2 = x2; 泛型接口的逆变,由于4.0之前界说的泛型接口没有添加out、in要害字, 对付统一个泛型参数,既不行以协变又不行以逆变,假如然的这么轻易绕已往, 我看看体系界说的Func到底和我们自界说的有什么差异: public delegate TResult Funcout TResult(); 多了一个out,原来的返回值,有个传入参数为泛型void Match(T t)的要领,此刻就呈现了是矛更尖利, 以上代码也可以直接写成: //delegate Tout MyFuncin Tin, object str4 = str1;//第一个泛型的逆变和第二个泛型的协变 以上都是没有题目的, 接着我们本身界说委托试试: 我X,咋办?谜底是不行行,也不能逆变,有个返回参数为泛型T Show()的要领。

小常识:

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读