Kann ein C# - lambda-Ausdruck immer void zurück?

Habe ich die folgende Methode, und ich möchte wissen, ob es irgendetwas gibt, was gehen kann in place Standard - (void) unten denn es gibt eine compiler-Fehlermeldung, die sagt, dass die ungültig ist nicht gültig hier:

private void applyDefaultsIfNecessary(ApplicationConfiguration configuration)
{
    var defaults = new Dictionary<Predicate<ApplicationConfiguration>, Action<ApplicationConfiguration>>()
    {
       //{ rule, action } - if rule is true, execute action 
       { (c) => c.ConnectionString == null , (c) => c.ConnectionString = "foo" },
       { (c) => c.OutputExcelFilePath == null, (c) => c.ConnectionString = "bar" },
       { (c) => c.OutputDirectory == null, (c) => c.OutputDirectory = "baz" }

    };

    //Nothing to select, but we want to loop throough the dict and invoke action, if rule is true.
    //It is a pity there is no extension method called DoForEach on collections.
    defaults.Select((item) => item.Key.Invoke(configuration) ? item.Value.Invoke(configuration) : default(void)  );
}

Merke ich, dass ich kann verwenden Sie die if-else-Anweisung anstelle der ternäre operator (oder ich könnte ein dummy-Methode void zurück). Auch die Select-Erweiterungsmethode nicht wie Lambda-Ausdrücke, die "void" zurückgeben. Es scheint zu sagen, dass der Typ nicht abgeleitet werden, aber natürlich, wenn ich den Typ angeben, wie diese, entweder:

defaults.Select<ApplicationConfiguration, void>((item) => { if (item.Key.Invoke(configuration)) item.Value.Invoke(configuration); } );

War ich neugierig von einem design-Sprache Standpunkt, warum wir uns nicht Ausdrücken können "void" zurückgeben oder den Datentyp für Variablen, ist nichtig.

  • "Es ist schade, dass es keine Erweiterung Methode namens DoForEach auf collections" es dauert etwa 3 Zeilen code hinzu, um eine extenssion IEnumerable, genau das zu tun
  • Sind Sie sicher, dass Sie don ' T mean return NULL anstelle von void?
  • Rusanu: Lesen - es gibt einen guten Grund, das war noch nicht Hinzugefügt. Meiner Meinung nach, ist es eine Schande, Sie haben es auf List<T>: blogs.msdn.com/ericlippert/archive/2009/05/18/...
  • Ersetzen von Standard - (void) mit null nicht helfen, entweder. Der compiler sagt es ist keine implict Konvertierung zwischen null und nichtig
  • Wählen Sie müssen etwas zurückgeben. Sie können nicht nur verwenden Sie eine Aktion wählen - Sie haben immer zu machen, wählen Sie wieder einige Typ T, und leere ist nichts", so funktioniert es nicht.
InformationsquelleAutor Raghu Dodda | 2010-01-08
Schreibe einen Kommentar