为什么这两种方法不含糊?

Mat*_*ero 15 .net c# asp.net methods overloading

这是该Ok()方法的签名ApiController:

protected internal virtual OkResult Ok();
Run Code Online (Sandbox Code Playgroud)

这是我RestController班上的方法(从中扩展而来ApiController):

// Note that I'm not overriding base method
protected IHttpActionResult Ok(string message = null);
Run Code Online (Sandbox Code Playgroud)

OkResultimplements开始IHttpActionResult,这两种方法都可以像这样调用:

IHttpActionResult result = Ok();
Run Code Online (Sandbox Code Playgroud)

事实上,这就是我在我的应用程序中所做的.

我的类PersistenceRestController(从中扩展而来RestController)具有以下代码行:

protected override async Task<IHttpActionResult> Delete(Key id)
{
    bool deleted = //... Attempts to delete entity
    if(deleted) return Ok();
    else return NotFound();
}
Run Code Online (Sandbox Code Playgroud)

编译很好,没有关于方法歧义的警告.这是为什么?

PersistenceRestController还继承了受保护的方法,ApiController所以它应该有两个版本Ok()(它确实).

在执行时,执行的方法是我的方法RestController.

编译器如何知道要运行哪种方法?

Dus*_*sty 10

Jon Skeet 在这里回答了一个类似的问题(没有继承复杂性):

当编译器有两个相同的选项可供选择时,它将使用一个重载,它不需要使用任何不匹配的可选参数而不是那个...

但是,在你的情况下,RestController选择的方法是因为它是派生的类.Jon在他的深度C#中详细讨论了这个主题- 看一下该页面的继承部分,它基本上表明编译器在较少派生类的方法之前更喜欢实际实例类的方法.