西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发C#.NET → c#中的协变与逆变

c#中的协变与逆变

相关软件相关文章发表评论 来源:本站整理时间:2010/12/21 17:25:30字体大小:A-A+

作者:佚名点击:134次评论:0次标签: 协变 逆变

  • 类型:图像处理大小:304KB语言:英文 评分:10.0
  • 标签:
立即下载
首先我们看一下msdn上关于这两个概念的说明:协变允许方法具有的派生返回类型比委托中定义的更多。逆变允许方法具有的派生参数类型比委托类型中的更少。

不知道大家看到这两句话时是怎么理解的,反正我是没有理解清楚,于是放狗查了一下,最终我的理解是:

 这些变化是在一个大的原则下进行的,即给程序所需要的范围一个更大的范围。

也许还是不清楚,来看一下小例子吧:

01 namespace ConsoleApplication1

02 {

03 class Program

04 {

05 static void Main(string[] args)

06 {

07 #region covariance test

08 Func<object> covarianceTest1 = () => getObject();

09 Func<object> covarianceTest2 = () => getString();

10 #endregion

11

12 #region contravariance test

13 Action<string> contravarianceTest1 = obj => setObject(obj);

14 Action<string> contravarianceTest2 = str => setString(str);

15 #endregion

16 }

17

18 private static object getObject() { return null; }

19 private static void setObject(object obj) { }

20

21 private static string getString() { return null; }

22 private static void setString(string str) { }

23

24 }

25

26

27 }

以Func<object>为例,它是协变事例:covarianceTest2所需的返回类型是一个object类的,但我给它实例化后,确是一个更精确的类型string,这是好理解的。

以Action<string>为例,它是逆变事例:contravarianceTest1所需的参数类型是一个string类的,但我给它实例化后,确是一个范围更大的类型object。

所有这些都是ms在定义这门语言时设计的,你可以把它当成一个语法记下来。

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)