L'Argument de type "void" n'est pas assignable à paramètre " type de Système.L'Action"

C'est mon code de test:

class PassingInActionStatement
{
    static void Main(string[] args)
    {
        var dsufac = new DoSomethingUsefulForAChange();

        dsufac.Do(WriteToConsole);
        dsufac.Do2(s => WriteToConsoleWithSomethingExtra("Test"));
        dsufac.Do(WriteToConsoleWithSomethingExtra("Test")); //Does not compile
    }

    internal static void WriteToConsole()
    {
        Console.WriteLine("Done");
    }

    internal static void WriteToConsoleWithSomethingExtra(String input)
    {
        Console.WriteLine(input);
    }
}

internal class DoSomethingUsefulForAChange
{
    internal void Do(Action action)
    {
        action();
    }

    internal void Do2(Action<String> action)
    {
        action("");
    }
}

Les 2 premiers appels de travail, mais je me demande pourquoi le 3ème n'a pas. Je n'ai pas envie de le code à l'intérieur de Do2 comme il semble étrange que j'ai type type action("") là pour le faire fonctionner.

Quelqu'un pourrait-il expliquer les 2 choses que je ne comprends pas, s'il vous plaît?

  1. Pourquoi je ne peux pas écrire à la troisième ligne comme ça avec l'appel Ne
  2. Pourquoi je dois écrire action("") afin de le faire fonctionner dans Do2
J'ai toujours marqué les réponses qui m'ont aidé. Si il n'y a pas une solution qui apporte quelque chose d'utile, je ne marquent pas jusqu'à ce que je reçois la réponse qui m'aide.

OriginalL'auteur Nyla Pareska | 2010-08-02