У меня есть простое действие в контроллере WebApi в ASP.NET Core 2.2, которое выглядит следующим образом:
[HttpGet("test123")]
public ActionResult<string> Test123()
{
return new OkResult();
}
Это прекрасно компилируется, но мне интересно, как это возможно, что OkResult
объект конвертируется в ActionResult<string>
?
Эти классы имеют различную цепочку наследования:
OkResult -> StatusCodeResult -> ActionResult
в то время как ActionResult<TValue>
только реализует IConvertToActionResult
Другими словами, ActionResult<string>
не является базовым типом для OkResult
класса.
Если я сделаю это вручную и поменяю код на:
[HttpGet("test123")]
public ActionResult<string> Test123()
{
var a = new OkResult();
var b = a as ActionResult<string>; // Error CS0039
return b;
}
код не скомпилируется с ошибкой преобразования:
Ошибка CS0039: Невозможно преобразовать тип «Microsoft.AspNetCore.Mvc.OkResult» в «Microsoft.AspNetCore.Mvc.ActionResult» с помощью преобразования ссылок, преобразования в бокс, распаковки, преобразования в оболочку или преобразования нулевого типа
Как возможно, что первый код работает, а второй нет? Как тип возвращаемого значения конвертируется из объектов, которые не имеют общего базового типа?