Почему это выражение нельзя преобразовать с использованием типа generi c в базовый тип? - PullRequest
2 голосов
/ 29 апреля 2020

Почему следующее выражение не может быть преобразовано, несмотря на определение 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>>'

1 Ответ

1 голос
/ 29 апреля 2020

Компилятор C# не выводит вложенные шаблоны c types .

Expression<Func<TEntity, TRelatedEntity>> - это вложенный обобщенный тип c. Ни TEntity, ни TRelatedEntity не выводятся во время компиляции. Таким образом, компилятор не знает, что Func<TEntity, TRelatedEntity> можно присвоить Func<TEntity, Entity>.

Например, без вложенного типа generi c ваш класс должен работать (хотя это может быть и не то, что вы хотите):

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...