c# - 协方差和 orderby() 问题

标签 c# expression-trees covariance

考虑下面的代码

public class CommentBll : IBaseBllPersistor<Comment>
    {
     public List<Comment> GetData<TProp>(Expression<Func<Comment, TProp>> selector)
    {         
        using (var context = new WebsiteContext())
        { 
            var query = (from q in context.Comment
                        select new CommentDto
                        {
                            ExtraProp = q.Name+q.Id.ToString(),
                            PostDate = q.PostDate,
                        }).OrderBy(selector);
            return query.ToList();
        }            
    }
    public class  CommentDto: Comment
    {
        public string ExtraProp { get; set; }    
    }
}

 public  class Comment: IBaseModel
{
    public string CommentText { get; set; }
    public DateTime PostDate { get; set; }
}

当我从查询末尾删除这部分时

OrderBy(selector)

我收到此错误,

Error   CS0029  Cannot implicitly convert type System.Collections.Generic.List<CommentDto> to System.Collections.Generic.List<Comment>

我知道协方差,并且我知道错误与它有关,但为什么当我添加 OrderBy(selector) 时错误消失了?
知道为什么会发生这种情况吗?

最佳答案

Any ideas why this might be happening?

这并不难解释。

让您的查询分为两部分:

var queryA = (from q in context.Comment
              select new CommentDto
              {
                  ExtraProp = q.Name+q.Id.ToString(),
                  PostDate = q.PostDate,
              });
var query = queryA.OrderBy(selector);

queryA的类型是 IQueryable<CommentDto> .

现在,selector 的第一个泛型参数的类型是 Comment 。自 IQueryable<T>是协变的且 Expression<TDelegate>是不变的,编译器满足第二个查询的唯一方法是威胁 queryAIQueryable<Comment> ,因此类型为 queryIOrderedQueryable<Comment> ,最后的ToList调用产生 List<Comment>

显然没有OrderBy您正在调用ToListqueryA结果是List<CommentDto>

在后一种情况下,IQueryable<T> 的协方差通过简单地显式指定 ToList 的通用参数,可以轻松获得所需的结果。调用:

return queryA.ToList<Comment>();

关于c# - 协方差和 orderby() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36374658/

相关文章:

c# - Bing map - 悬停时突出显示带有多边形的国家/地区

c# - 有没有办法调用 .NET Framework 离线安装?

c# - 如何根据枚举的类型和字段之一的名称创建枚举的表达式?

c# - NULLIF 的表达式方法(带 Divide)

java - 在类中使用子类型作为类型参数

scala - Scala 中关于协方差的一些问题

c# - ILogger 的隐式范围

c# - 有没有办法使用 MD5 通过 DirectoryServices 向 LDAP 进行身份验证?

c# - expression.bind 和 expression.assign 之间有什么区别(或 : what is special about MemberBinding)

java - Java 中的快速矩阵计算