求解释一下:.NET中,参数类型是协变的,方法的返回类型是抗变的。

问题描述

两个概念不太明白,求解释下~

解决方案

解决方案二:
https://zh.wikipedia.org/wiki/%E5%8D%8F%E5%8F%98%E4%B8%8E%E9%80%86%E5%8F%98看看这个你就懂了
解决方案三:
引用1楼mrjia的回复:

https://zh.wikipedia.org/wiki/%E5%8D%8F%E5%8F%98%E4%B8%8E%E9%80%86%E5%8F%98看看这个你就懂了

嗯,里面讲的参数是抗变的,和C#相反。这样说对吧:协变,子类作父类用;抗变,父类作子类用。还有C#的参数类型是将子类赋给父类,可以叫做协变,但是返回的类型也是将子类型返回的,怎么成了抗变了?求讲解,谢谢~
解决方案四:
引用1楼mrjia的回复:

https://zh.wikipedia.org/wiki/%E5%8D%8F%E5%8F%98%E4%B8%8E%E9%80%86%E5%8F%98看看这个你就懂了

等一下,你们是怎么能访问中文维基的?我这都墙到现在了
解决方案五:
简单地讲:有个函数F1接受的参数是A1类型,返回值是B1类型A1a1;B1b1=F1(a1);另一个函数F2,接受的参数是A1的子类A2类型,返回值是B1类型A2a2;B1b1=F2(a2);F2当然也就可以接受A1类型的参数,返回B1类型的返回值A1a1;B1b1=F2(a1);也就是说在这里F2可以起到代替F1的效果。另一个函数F0,接受的参数是A1类型,返回值是B1的父类B0类型A1a1;B0b0=F0(a1);把返回值赋值给B1类型的变量就不行了A1a1;B1b1=F0(a1);//会报错,缺少一个类型转换也就是说在这里F0不可以起到代替F1的效果。反过来,F1可以起到替代F0的效果A1a1;B0b0=F1(a1);
解决方案六:
引用4楼yangyi_2009的回复:

简单地讲:有个函数F1接受的参数是A1类型,返回值是B1类型A1a1;B1b1=F1(a1);另一个函数F2,接受的参数是A1的子类A2类型,返回值是B1类型A2a2;B1b1=F2(a2);F2当然也就可以接受A1类型的参数,返回B1类型的返回值A1a1;B1b1=F2(a1);也就是说在这里F2可以起到代替F1的效果。另一个函数F0,接受的参数是A1类型,返回值是B1的父类B0类型A1a1;B0b0=F0(a1);把返回值赋值给B1类型的变量就不行了A1a1;B1b1=F0(a1);//会报错,缺少一个类型转换也就是说在这里F0不可以起到代替F1的效果。反过来,F1可以起到替代F0的效果A1a1;B0b0=F1(a1);

刚才接了个电话犯糊涂了,无视这个回复吧。
解决方案七:
逆变:有个函数F1接受的参数是A1类型voidF1(a1);另一个函数F2,接受的参数是A1的子类A2类型voidF2(a2);F2不能当F1用,传a1的参数进去F2(a1)会报错F1能当F2用,可以传a2的参数进去F1(a2)协变:有个函数G1返回是B1类型B1G1();另一个函数G0,返回值是B1的父类B0类型B0G0();G0不能当G1用,返回值赋值给B1类型变量b1=G0()会报错G1能当G0用,返回值可以赋值给B0类型变量b0=G1()

时间: 2025-01-02 21:38:08

求解释一下:.NET中,参数类型是协变的,方法的返回类型是抗变的。的相关文章

java-代码中子类在调用重名方法时返回结果为null,究竟调用过程是怎样的?

问题描述 代码中子类在调用重名方法时返回结果为null,究竟调用过程是怎样的? class father { private String name; father(String name) { this.name=name; } public String get_name() { return this.name; } } class son extends father { private String name; son(String name) { super(name); } pub

c++ 编译错误-大神请指教c++错误:返回类型与重写虚拟函数的返回类型既不相同也不协变

问题描述 大神请指教c++错误:返回类型与重写虚拟函数的返回类型既不相同也不协变 #include using namespace std; class base1{ public: virtual void display() const; }; void base1::display() const{ cout<<"base1::display()"<<endl; } class base2:public base1{ public: void displa

急求 在火狐浏览器中取不到一般处理程序.ashx的返回值

问题描述 在火狐浏览器中取不到一般处理程序.ashx的返回值但在IE中可以..求哪位大侠指点 解决方案 解决方案二:和服务器端有什么关系.应该是你客户端取值的代码的问题.解决方案三:用firebug看看响应数据,应该是你前端代码问题吧

C#和asp.net中链接数据库中参数的几种传递方法实例代码_实用技巧

复制代码 代码如下: #region 参数传递方法第一种     //参数设置方法(第一种)      //SqlParameter sp = new SqlParameter("@Name", str_Name);      //SqlParameter sp2 = new SqlParameter("@Pwd", str_Pwd);      //cmd.Parameters.Add(sp);      //cmd.Parameters.Add(sp2);  #

ASP.NET中MVC使用AJAX调用JsonResult方法并返回自定义错误信息_实用技巧

一.如何用AJAX调用JsonResult方法 比如FuckController中添加有个返回JsonResult类型的方法FuckJson(): 复制代码 代码如下: <span class="kwd">public<span class="pln"> <span class="typ">JsonResult<span class="pln"> <span class=&

vb-Vb中如何编码撤销功能,也就是返回上一步的操作!求代码

问题描述 Vb中如何编码撤销功能,也就是返回上一步的操作!求代码 5C Vb中如何编码撤销功能,也就是返回上一步的操作!求代码!求解答! 解决方案 直接往你的文本框发送 wm_undo 消息Declare Function SendMessage Lib ""user32"" Alias ""SendMessageA"" (ByVal hwnd As Long _ByVal wMsg As Long ByVal wParam

Lua5.1中加载dll动态链接库的方法_Lua

一.加载专门为lua写的扩展dll     使用require或package.loadlib方法,在此不做过多解释. 二.加载不是专为lua写的扩展dll     "不是专为lua写的扩展dll"是指:dll中并没有以lua注册函数的方式导出接口,而是以__declspec(dllexport)形式导出的接口.这样就不能使用"package.loadlib"方法调用,而要使用lua5.1封装过的"alien.load()"方法.(Lua\5.1

SpringMVC如何处理controller的各种返回类型

问题描述 SpringMVC如何处理controller的各种返回类型 本人小白,求教一下各位大神,springMVC的controller的返回值都可以是什么类型? 然后springMVC对于各种返回类型是怎么处理的. 比如,我知道,如果controller返回string类型的值,那么springMVC会根据视图解析器拼接得到url,从而知道目标视图. 那么,当controlloer返回Map类型.void类型.ModelAndView(有些ModelAndView设置了viewName,有

Java 中 无参&amp;#183;有参 方法的使用

Java 中无参无返回值方法的使用 如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名为 show ,没有参数,且没有返回值的方法,执行的操作为输出 " welcome to imooc. " 注意哦: 1. 方法体放在一对大括号中,实现特定的操作 2. 方法名主要在调用这个方法时使用,需要注意命名的规范,一般采用第一个单词首字母小写,其它单词首字母大写的形式 第二步,调用方法 当需要调用方法执行某个操作