Это подпись для метода Ok() в ApiController:
protected internal virtual OkResult Ok();
И это мой метод из моего класса RestController (который простирается от ApiController):
// Note that I'm not overriding base method
protected IHttpActionResult Ok(string message = null);
Так как OkResult реализует IHttpActionResult, оба этих метода можно вызвать так:
IHttpActionResult result = Ok();
Фактически, это то, что я делаю в своем приложении.
Мой класс PersistenceRestController (который простирается от RestController), имеет следующие строки кода:
protected override async Task<IHttpActionResult> Delete(Key id)
{
bool deleted = //... Attempts to delete entity
if(deleted) return Ok();
else return NotFound();
}
Это компилируется отлично, и не возникает предупреждения о неоднозначности метода. Почему это?
PersistenceRestController также унаследовал защищенные методы от ApiController, поэтому он должен иметь обе версии Ok() (и он делает).
При выполнении, выполненный метод является тем из моих RestController.
Как компилятор знает, какой метод запускать?