ASP.NET Core API如何在操作方法中将ActionResult <T>转换为T

时间:2019-06-09 09:18:17

标签: c# .net-core

作为示例,请看下面的代码,它是一个API动作:

[HttpGet("send")]
public ActionResult<string> Send()
{
    if (IsAuthorized())
    {
        return "Ok";
    }
    return Unauthorized(); // is of type UnauthorizedResult -> StatusCodeResult -> ActionResult -> IActionResult
}

我的问题是这里的数据转换是如何发生的?编译器怎么不会失败?

1 个答案:

答案 0 :(得分:6)

这可能是由于称为运算符重载的语言功能所致,该功能允许创建自定义运算符。 ActionResult具有这样的implementation

public sealed class ActionResult<TValue> : IConvertToActionResult
{
       public TValue Value { get; }

       public ActionResult(TValue value)
       {
            /* error checking code removed */
            Value = value;
       }

       public static implicit operator ActionResult<TValue>(TValue value)
       {
           return new ActionResult<TValue>(value);
       }
}

public static implicit operator即此方法提供了将TValue隐式转换为ActionResult类型的逻辑。这是一个非常简单的方法,它会创建一个新的ActionResult,并将其值设置为名为Value的公共变量。这种方法使之合法:

ActionResult<int> result = 10; <-- // same as new ActionResult(10)

这实际上为您在Action方法中所做的合法创建了合成糖。