ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

为什么不能从受约束的通用集合中推断出接口?

2019-10-28 19:14:41  阅读:177  来源: 互联网

标签:generics covariance contravariance c


我有一段这样的代码:

public IEnumerable<ICacheMember> Flubvert( IEnumerable<ICacheMember> members ) 
   {
        // do some stuff to members
        return members;
   }

但是我对为什么不能这样做感到困惑:

public IEnumerable<T> ExecuteFlubversion<T>( IEnumerable<T> memberList ) where T: class,ICacheMember 
{
      return Flubvert( memberList );
}

当然,对泛型的约束应该保证memberList是ICacheMembertype的IEnumerable?我真的需要将现有(但隐式)ICacheMember对象的集合转换为显式ICacheMember对象,然后再将其转换回吗?我可以理解,鉴于Flubvert的方法签名,我可能需要将它们转换回去,但是我不明白为什么我必须在方法调用中转换它们.这是我在工作代码中所做的工作,但似乎与泛型的一般优雅行为完全不符,因此,我认为我一定会对这种操作方式有所误解.

解决方法:

首先,IEnumerable< out T>的协方差为0. (和其他通用类型)仅在T是引用类型时有效,因此您需要:

public IEnumerable<ICacheMember> ExecuteFlubversion<T>(IEnumerable<T> memberList)
    where T: class, ICacheMember  // NOTE 'class'
{
    var flub = Flubvert(memberList);   // can you call with 'memberList'?
    return flub;                       // can you return that type?

    // depending on what 'Flubvert' does, maybe return 'IEnumerable<T>'
    // and say:
    // return (IEnumerable<T>)flub;
}

另请注意,我更改了返回值. C#编译器不能保证非通用Flubvert方法返回的对象比IEnumerable< ICacheMember>更具体.

标签:generics,covariance,contravariance,c
来源: https://codeday.me/bug/20191028/1954782.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有