2016-03-30 3 views
0

я метод расширения для IEnumerable интерфейс, который принимает делегат типа Func<T, bool?> в качестве аргумента:Func делегат работает неожиданно

public static bool? ForEach<T>(this IEnumerable<T> source, Func<T, bool?> func) 
{ 
     bool? commandSuccessful = true; 

     foreach (var element in source) 
     { 
      var rv = func(element); 

      if (rv == null) 
      { 
       return null; 
      } 

      if (rv == false) 
      { 
       commandSuccessful = false; 
      } 
     } 

     return commandSuccessful; 
    } 

Но тот же метод расширения все еще можно использовать, когда подпись FUNC является Func <T, RuntimeDetails, bool?>:

RuntimeDetails lastRuntimeDetails = null; 
var startCommandSuccessful = 
    activeConfiguration.Applications.ForEach( 
         _ => PrepareRuntimeDetailsAndDownload(_ , ref lastRuntimeDetails)); 



private bool? PrepareRuntimeDetailsAndDownload(Application configurationApplication, 
      ref RuntimeDetails lastRuntimeDetails) 
     {...} 

Я смущен и радостен в то же время. Почему это сработало? Если это не сработало, я понятия не имею, как я буду писать расширение, потому что параметр RuntimeDetails неизвестен в методе расширения.

+0

Почему вопрос остается без изменений? – meonstackexchange

ответ

6

Ваше предположение неверно

_ => PrepareRuntimDetailsAndDownload(...) 

неFunc<T, RunTimeDetails, bool?>! Он is a Func<T, bool?>, он принимает один аргумент типа T и возвращает bool?. Вы не передаете lastRuntimeDetails в качестве аргумента. Это всего лишь closure.

+0

Итак, func, я перехожу к методу расширения, не является функцией 'PrepareRuntimeDetailsAndDownload', но анонимной лямбда ... – meonstackexchange

+0

@meonstackexchange точно. –

3

лямбда _ => PrepareRuntimeDetailsAndDownload(_ , ref lastRuntimeDetails) принимает один параметр (_) типа T и производит результат типа bool?. Поэтому это тип Func<T, bool?>, а не Func<T, RuntimeDetails, bool?>.

Смежные вопросы