Лямбда "не может быть выведена из использования" - PullRequest
7 голосов
/ 09 февраля 2009

У меня объявлен следующий словарь:

private readonly Dictionary<int, Image> dictionary;

И у меня есть метод, который вызывает ошибку компилятора:

    public IQueryable<Image> Find(Func<Image, bool> exp)
    {
        return  dictionary.Single(exp);
    }

Я получаю ошибку:

Error   1   The type arguments for method 'System.Linq.Enumerable.Single<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,bool>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. C:\work\MSD-AIDS-Images\MSD-AIDS-Images-Test\TestImageRepository.cs 34  30  MSD-AIDS-Images-Test

Я пытался погуглить, кажется, я не могу найти ничего определенного в том, что я делаю неправильно

Редактировать - это утро понедельника на работе.

Я хотел поставить «где», а не один

Редактировать 2!

Хорошо, код теперь такой:

public IQueryable<Image> Find(Func<Image, bool> exp)
{
    return dictionary.Values.Where(exp);
}

Теперь я получаю следующую ошибку:

Error   1   Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<MSD_AIDS_Images_Data.Image>' to 'System.Linq.IQueryable<MSD_AIDS_Images_Data.Image>'. An explicit conversion exists (are you missing a cast?)    C:\work\MSD-AIDS-Images\MSD-AIDS-Images-Test\TestImageRepository.cs 34  20  MSD-AIDS-Images-Test

В качестве FYI существует метод реализации интерфейса, декларация которого:

IQueryable<T> Find(Func<T, bool> exp);

Это сложнее, чем должно быть!

Ответы [ 3 ]

7 голосов
/ 09 февраля 2009

Что вы пытаетесь сделать? Например, Single вернет экземпляр T, а не IQueryable<T> (а для объектов вы, вероятно, все равно должны использовать IEnumerable<T>) ...

Такое ощущение, что ты хочешь:

public Image Find(Func<Image, bool> predicate)
{
    return dictionary.Values.Single(predicate);
}

Конечно, вы можете сделать это глобально как метод расширения с помощью чего-то вроде:

( редактировать включает Where из вопроса редактирования)

static class DictionaryExtensions
{
    public static TValue FindSingle<TKey, TValue>(
        this IDictionary<TKey, TValue> dictionary,
        Func<TValue, bool> predicate)
    {
        return dictionary.Values.Single(predicate);
    }
    public static IEnumerable<TValue> Find<TKey, TValue>(
        this IDictionary<TKey, TValue> dictionary,
        Func<TValue, bool> predicate)
    {
        return dictionary.Values.Where(predicate);
    }
}

(Я не уверен, что вызывающему абоненту гораздо сложнее сделать это самостоятельно)

3 голосов
/ 09 февраля 2009

Существует явное преобразование (вам не хватает приведения?)

Существует два Where метода, один для System.Linq.Enumerable (который он использует), а другой для System.Linq.Queryable (который, по вашему мнению следует использовать в соответствии с этим типом возврата).

Вам необходимо выполнить одно из следующих действий:

  • изменить тип возвращаемого значения на IEnumerable<Image> - я рекомендую это!
  • изменить вызов метода на Queryable.Where(dictionary.Values.AsQueryable(), exp)
  • звонок AsQueryable()
2 голосов
/ 09 февраля 2009

IDictionary<TKey, TValue> реализует IEnumerable<KeyValuePair<TKey,TValue>>, поэтому ваш Func должен выглядеть как Func<KeyValuePair<TKey,TValue>>.

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