2016-03-30 9 views
0

Ich habe eine Erweiterungsmethode für die IEnumerable-Schnittstelle, die einen Delegaten vom Typ nimmt Func<T, bool?> als Argument:Func Delegierten arbeiten unerwartet

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; 
    } 

Aber die gleiche Extension-Methode noch verwendet werden, wenn die Unterschrift des func Func <T, RuntimeDetails, bool?> ist:

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



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

Ich bin verwirrt und fröhlich zur gleichen Zeit. Warum hat es funktioniert? Wenn es nicht funktioniert habe ich keine Ahnung, wie ich die Erweiterung schreiben würde, weil der RuntimeDetails Parameter in der Erweiterungsmethode unbekannt ist.

+0

Warum wird die Frage abgelehnt? – meonstackexchange

Antwort

6

Ihre Annahme ist falsch

_ => PrepareRuntimDetailsAndDownload(...) 

nicht ist ein Func<T, RunTimeDetails, bool?>! Es ist ein Func<T, bool?>, es dauert ein Argument des Typs T und gibt eine bool? zurück. Sie übergeben lastRuntimeDetails nicht als Argument. Es ist nur ein closure.

+0

Die Funktion, die ich an die Erweiterungsmethode übergebe, ist also nicht die 'PrepareRuntimeDetailsAndDownload'-Funktion, sondern das anonyme Lambda ... – meonstackexchange

+0

@meostackexchange genau. –

3

Das Lambda _ => PrepareRuntimeDetailsAndDownload(_ , ref lastRuntimeDetails) nimmt einen Parameter (_) vom Typ T und erzeugt ein Ergebnis des Typs bool?. Daher ist es Typ Func<T, bool?>, nicht Func<T, RuntimeDetails, bool?>.