为什么不能将此表达式从使用通用类型转换为使用基本类型?

问题描述 投票:2回答:1

尽管定义了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# .net generics lambdaexpression
1个回答
1
投票

C#编译器does not infer nested generic types

Expression<Func<TEntity, TRelatedEntity>>是嵌套的泛型类型。在编译时都不会推断TEntityTRelatedEntity。因此,编译器不知道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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.