2016-09-15 3 views
1

Я хочу передать Func<IList<object>, int> методу, который принимает Func<IEnumerable<object>, int>. Кажется, это не работает. Можно ли сделать что-то вроде ниже?Передача Func <IList, int> методу, принимающему Func <IEnumerable, int>?

class A { 
     void Test() { 
      IList<object> data = new List<object>(); 

      // can't pass in MyFunc, doesn't compile 
      ApplyFunc(MyFunc, data); 
     } 

     int MyFunc(IList<object> data) { 
      return 0; 
     } 

     void ApplyFunc(Func<IEnumerable<object>, int> f, IList<object> data) { 
      f(data); 
     } 
    } 
+2

Это возможно дубликат https://stackoverflow.com/questions/36006997/func-variance-with-multiple-parameters/36007182 или https://stackoverflow.com/questions/13025176/conversion-from-funcobject-string-to-funcstring-string- работает, но к funcint. – kiziu

ответ

3

Поскольку соответствующий делегат определяется как Func (в T,. ..), вам разрешено использовать менее производный тип. IList (T) реализует IEnumerable (T), который является более производным.

(Из комментария kiziu в ...) Conversion from Func<object,string> to Func<string,string> works but to Func<int,string> fails

Возможные решения использовать лямбда (как описано в одном из других ответов) или изменить подпись MyFunc

-2

Если генерики вариант, вы можете сделать:

class A { 
    void Test() { 
     IList<object> data = new List<object>(); 

     // can't pass in MyFunc, doesn't compile 
     ApplyFunc(MyFunc, data); 
    } 

    int MyFunc(IList<object> data) { 
     return 0; 
    } 

    void ApplyFunc<TEnumerable>(Func<TEnumerable, int> f, TEnumerable data) 
     where TEnumerable : IEnumerable<object> 
    { 
     f(data); 
    } 
} 

Смотрите скрипку: https://dotnetfiddle.net/juEWYf

+0

, если мне не хватает чего-то, что не компилируется. – CoderBrien

+0

@CoderBrien изменил его. С делегатом вам понадобится бросок. Прости, пропустил это. – Nico

2

Ваш тест метод может быть следующим:

public void Test() 
{ 
    IList<object> data = new List<object>(); 

    ApplyFunc(x => MyFunc(x as IList<object>), data); 
} 
Смежные вопросы