Ambiguità con parametro Action e Func

Com’è ansible che questo codice

TaskManager.RunSynchronously(fileMananager.BackupItems, package); 

causa un errore di compilazione

 The call is ambiguous between the following methods or properties: 'TaskManager.RunSynchronously(System.Action, MyObject)' and 'TaskManager.RunSynchronously(System.Func, MyObject)' 

quando la firma dell’azione è

 public void BackupItems(MyObject package) 

e i metodi “ambigui” sono

 static class TaskManager { public static void RunSynchronously(Action task, TInput param) { Task.Factory.StartNew(() => task(param)); } public static bool RunSynchronously(Func task, TInput param) { return Task.Factory.StartNew(() => task(param)).Result; } } 

Mi sembra che ci sia una grande differenza tra questi metodi. Cosa mi manca qui?

MODIFICARE:

Oltre alla risposta accettata, ho appena trovato una soluzione in una domanda simile. Ecco il link .

Il motivo è che il tipo di ritorno di un metodo non fa parte della sua firma. Quindi, mentre risolve il sovraccarico corretto, il compilatore guarda solo il parametro del metodo.

La soluzione più semplice è semplicemente non utilizzare la conversione del gruppo metodo implicita. Tutti i seguenti compila:

 TaskManager.RunSynchronously( x => fileMananager.BackupItems(x), package); TaskManager.RunSynchronously( (Action)fileMananager.BackupItems, package); TaskManager.RunSynchronously( new Action(fileMananager.BackupItems), package); 

Il primo è il più elegante di loro, ma è anche l’unico con un impatto sulle prestazioni di runtime lieve, a causa di un ulteriore reindirizzamento. Tuttavia, questo impatto è così piccolo che in realtà non dovrebbe interessarti.

Ho trovato lo stesso problema, la soluzione era:

 var r = RunSynchronously(x => { return true; }, true); RunSynchronously(x => { }, true); 

Ora, perché il compilatore non può farlo ???