dsufac.Do(WriteToConsoleWithSomethingExtra("Test"));
фактически сначала вызывает функцию (WriteToConsoleWithSomethingExtra("Test")
), а затем пытается передать результат в Do
.Поскольку нет результата (void
), это невозможно.
То, что вы на самом деле хотите, это:
dsufac.Do(() => WriteToConsoleWithSomethingExtra("Test"));
Внутренняя часть объявляет функциюничего не берет (бит () =>
), который вызывает WriteToConsoleWithSomethingExtra("Test")
при выполнении. Тогда ваш dsufac.Do
вызов получит действие, как и ожидалось.
Что касается Do2
- вы объявили, что принимаете Action<String>
, что означает, что action
это функция, которая принимает один аргумент .Вы должны передать ему строку.Эта строка может быть пустой, как в вашем примере action("")
, или она может передаваться извне, как в следующем примере:
dsufac.Do3(WriteToConsole, "Test");
...
internal void Do3(Action<String> action, String str)
{
action(str);
}