作为示例,请看下面的代码,它是一个API动作:
[HttpGet("send")]
public ActionResult<string> Send()
{
if (IsAuthorized())
{
return "Ok";
}
return Unauthorized(); // is of type UnauthorizedResult -> StatusCodeResult -> ActionResult -> IActionResult
}
我的问题是这里的数据转换是如何发生的?编译器怎么不会失败?
答案 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方法中所做的合法创建了合成糖。