method - task startnew c#
¿Por qué es ambigua la llamada? ''Task.Run(Action)'' y ''Task.Run(Func<Task>)'' (1)
Debería estar claro, pero la especificación del idioma nunca dijo que los tipos de retorno no coincidentes tendrían ningún efecto durante la resolución de sobrecarga. Debido a eso, no había ninguna regla que dijera que preferiría Action sobre Func<Task> . Si se escogiera Action , seguro, funcionaría. Si se seleccionara Func<Task> , entonces seguro, obtendrías un error. Pero para elegir cualquiera de los dos, la resolución de sobrecarga tiene que tener éxito, y no tiene esto en cuenta.
Se supone que esto se solucionará con la nueva resolución de sobrecarga en C # 7.3 .
Teniendo en cuenta el siguiente código:
public void CacheData()
{
Task.Run((Action)CacheExternalData);
Task.Run(() => CacheExternalData());
Task.Run(CacheExternalDataTask);
Task.Run(CacheExternalData);
}
public Task CacheExternalDataTask()
{
// Long running code
return Task.FromResult("Data");
}
public void CacheExternalData()
{
// Long running code
}
¿Por qué es Task.Run(CacheExternalData) ? ¿Y Task.Run(CacheExternalDataTask) no lo es?
Al llamar a Task.Run con CacheExternalData , pensé que estaba claro para el compilador que el método no devuelve una Task y que debería resolverse en una Action .