首页 > 解决方案 > 为什么不能将此表达式从使用泛型类型转换为使用基类型?

问题描述

尽管定义了 ,为什么不能转换以下表达式where TRelatedEntity : Entity

internal class RelationshipResolver<TEntity> where TEntity : Entity
{
    private readonly List<Expression<Func<TEntity, Entity>>> toOneExpressions = 
        new List<Expression<Func<TEntity, Entity>>>();

    internal RelationshipResolver<TEntity> Include<TRelatedEntity>(
        Expression<Func<TEntity, TRelatedEntity>> oneToOnerelationship)
            where TRelatedEntity : Entity
    {
        toOneExpressions.Add(oneToOnerelationship);
        return this;
    }
...

编译错误toOneExpressions.Add(oneToOnerelationship)

Argument 1: cannot convert from 'System.Linq.Expressions.Expression<System.Func<TEntity, TRelatedEntity>>' to 'System.Linq.Expressions.Expression<System.Func<TEntity, Microsoft.Xrm.Sdk.Entity>>'

标签: c#.netgenericslambda

解决方案


C# 编译器不会推断嵌套的泛型类型

Expression<Func<TEntity, TRelatedEntity>>是嵌套的泛型类型。在编译时既不TEntity也不推断。TRelatedEntity所以编译器不知道Func<TEntity, TRelatedEntity>可分配给Func<TEntity, Entity>.

例如,如果没有嵌套的泛型类型,您的类应该可以工作(尽管它可能不是您想要的):

internal class RelationshipResolver<TEntity> where TEntity : Entity
{
    private readonly List<Func<TEntity, Entity>> toOneExpressions =
        new List<Func<TEntity, Entity>>();

    internal RelationshipResolver<TEntity> Include<TRelatedEntity>(
        Func<TEntity, TRelatedEntity> oneToOnerelationship)
        where TRelatedEntity : Entity
    {
        toOneExpressions.Add(oneToOnerelationship);
        return this;
    }
}

推荐阅读