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
.