Generic ActionResule<T> 不尊重类型 T

问题描述 投票:0回答:1

在下面的示例中,Get 方法的返回类型为

ActionResult<SomeAltResult>
但是return语句返回OKResult,其中包含WeatherForecast的IEnumerable,并且仍然编译成功。

我无法理解如果我可以返回任何东西,那么拥有 Generic

ActionResult<T>
有什么意义,我可以使用 ActionResult 或 IActionResult。

还请帮助我理解,

ActionResult<T>
不继承OkObjectResult的任何类或接口链,那么多态性是如何在这里工作的。

`
namespace WebApplication1.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

    [HttpGet(Name = "GetWeatherForecast")]
    public ActionResult<SomeAltResult> Get()
    {
        var x = Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();

        return Ok(x);
    }
}

public class SomeAltResult
{
    public string Name { get; set; }
}
}

`

c# asp.net-mvc asp.net-core oop polymorphism
1个回答
0
投票

ActionResult 不 继承 OkObjectResult 的任何类或接口链然后如何 多态性在这里起作用。

不正确,请检查OkObjectResult的源代码,它是ObjectResult的子类。

ObjectResult
实现了 ActionResult,这就是为什么你可以在
Get()
中返回它。
Ok(x)
基本上返回一个
ObjectResult

另请查看文档,ActionResult 与 IActionResult

ActionResult 与 IActionResult 相比具有以下优点 类型:

  • 可以排除 [ProducesResponseType] 属性的 Type 属性。例如,[ProducesResponseType(200, 类型 = typeof(Product))] 简化为 [ProducesResponseType(200)]。这 操作的预期返回类型是从 T 中推断出来的 行动结果。
  • 隐式转换运算符支持将 T 和 ActionResult 转换为 ActionResult。 T 转换为 ObjectResult,
    表示返回 new ObjectResult(T);简化为 return T;.
© www.soinside.com 2019 - 2024. All rights reserved.