繁体   English   中英

ASP.NET Core如何将任何类型转换为ActionResult <T> 控制器动作的返回类型?

[英]How is ASP.NET Core able to convert any type to ActionResult<T> return type of controller actions?

我在ASP.NET Core 2.2中的WebApi控制器中有一个简单的操作,如下所示:

[HttpGet("test123")]
public ActionResult<string> Test123()
{
    return new OkResult();
}

这样编译可以,但是我想知道OkResult对象怎么可能转换为ActionResult<string>

这些类具有不同的继承链: OkResult -> StatusCodeResult -> ActionResultActionResult<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”

第一个代码如何工作而第二个代码却不工作呢? 如何从没有通用基本类型的对象转换返回类型?

ActionResult<TValue>的以下两个隐式运算符

/// <summary>
/// Implictly converts the specified <paramref name="value"/> to an <see cref="ActionResult{TValue}"/>.
/// </summary>
/// <param name="value">The value to convert.</param>
public static implicit operator ActionResult<TValue>(TValue value)
{
    return new ActionResult<TValue>(value);
}

/// <summary>
/// Implictly converts the specified <paramref name="result"/> to an <see cref="ActionResult{TValue}"/>.
/// </summary>
/// <param name="result">The <see cref="ActionResult"/>.</param>
public static implicit operator ActionResult<TValue>(ActionResult result)
{
    return new ActionResult<TValue>(result);
}

资源

是什么允许在操作中使用多种返回类型。

[HttpGet("test123")]
public ActionResult<string> Test123() {
    if(someCondition) return "String value"; //<--String
    return Ok(); //<-- OkResult
}

返回字符串后,将调用ActionResult<TValue>(TValue value)运算符,并返回有效的ActionResult<TValue> ,反之亦然。

您的第一个示例利用了隐式的用户定义类型转换运算符,该运算符如下所示

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

根据docs ,您的第二个示例as使用不能使用隐式转换运算符as:

...仅执行参考转换,可为空的转换和装箱转换。 as运算符不能执行其他转换,例如用户定义的转换,而应使用强制转换表达式来执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM