Невозможно преобразовать тип выражения «лямбда-выражение» в тип возврата «System.Linq.Expressions.Expression <System.Func <IProduct, string, bool >> ' - PullRequest
4 голосов
/ 12 января 2010

Хорошо, я потерян. Почему 1-я функция НЕПРАВИЛЬНА (волнистые в лямбда-выражении), а 2-я - ПРАВИЛЬНАЯ (то есть компилируется)?

    public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val)
    {
        return (h => h.product_name == val);

    }

    public static Expression<Func<IProduct, bool>> IsValidExpression2()
    {
        return (m => m.product_name == "ACE");

    }

Ответы [ 4 ]

6 голосов
/ 12 января 2010

Ваша первая функция будет нуждаться в двух аргументах. Func<x,y,z> определяет два параметра и возвращаемое значение. Поскольку у вас есть и IProduct, и string в качестве параметров, вам понадобится два аргумента в вашей лямбде.

  public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val)
  {
        return ((h, i) => h.product_name == val);
  }

Ваша вторая функция - только Func<x,y>, поэтому это означает, что сигнатура функции имеет только один параметр, и, следовательно, ваш лямбда-оператор компилируется.

3 голосов
/ 12 января 2010

Что означает середина string?Вы можете заставить его скомпилировать:

public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val)
{
    return (h,something) => h.product_name == val;
}

Или, может быть, вы имеете в виду:

public static Expression<Func<IProduct, string, bool>> IsValidExpression()
{
    return (h,val) => h.product_name == val;
}

?

0 голосов
/ 10 марта 2015

Прежде чем пытаться исправить лямбда-выражение, убедитесь, что следующие ссылки были добавлены в связанный файл cs:

using System.Linq;
using System.Linq.Expressions;

Отсутствие этих ссылок также может привести к той же ошибке ( "Невозможно преобразовать лямбда-выражение в тип 'System.Linq.Expressions.Lambda Expression', поскольку это не тип делегата" ).

0 голосов
/ 12 января 2010

Func<IProduct, string, bool> является делегатом метода со следующей подписью:

bool methodName(IProduct product, string arg2)
{
  //method body
  return true || false;
}

так

public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val)
{
    return (h => h.product_name == val);
}

имеет разницу между типом возвращаемого значения и возвращаемым значением. вы пытаетесь вернуть объект типа Expression<Func<IProduct, bool>>.

аргумент val не является аргументом для метода, которому вы делегируете, но будет поднят (сделан частью класса, реализующего результирующую функцию), и, поскольку он не является аргументом для результирующего метода, он не должен быть частью Func тип объявления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...