C# 空合并运算符不接受不同的类型

C# 空合并运算符不接受不同的类型,c#,.net,asp.net-mvc,asp.net-core,.net-core,C#,.net,Asp.net Mvc,Asp.net Core,.net Core,我开始时返回了一个自定义类: [HttpGet] 公共操作结果Getstring id=> 这个.\u roundsService.Getid; rounds服务中的Get方法可以返回null,并且该方法将转换为HTTP 204 No Content。我想知道当我为空时如何返回404: [HttpGet] 公共操作结果Getstring id=> 这个._roundsService.Getid??未发现; 显然,这不起作用,并给我一个CS0019错误:运算符“??”不能应用于“Round”和“N

我开始时返回了一个自定义类:

[HttpGet] 公共操作结果Getstring id=> 这个.\u roundsService.Getid; rounds服务中的Get方法可以返回null,并且该方法将转换为HTTP 204 No Content。我想知道当我为空时如何返回404:

[HttpGet] 公共操作结果Getstring id=> 这个._roundsService.Getid??未发现; 显然,这不起作用,并给我一个CS0019错误:运算符“??”不能应用于“Round”和“NotFoundResult”类型的操作数

我对其他一行代码持开放态度,如果不为null,则返回所需的对象;如果为null,则返回404

我在netcoreapp3.0框架中使用C 8.0。我还没有启用可为空的功能。这会导致问题吗

以防万一,下面是服务类中的方法:

public Round Getstring id=> 这个.u rounds.Findround=>round.Id==Id.FirstOrDefault;
当然,它不能这样做。这只是if的简写。我认为与你所写内容相同的是:

ActionResult<Round> result = this._roundsService.Get(id);
if(result == null)
  result = NotFound();
return result;
在这一点上,编译器真的很困惑为什么要将NotFound返回值赋给ActionResult变量。

调用NotFound时,您正在创建NotFoundResult。方法的返回类型为ActionResult,但NotFoundResult实际上并不继承ActionResult,因此不能直接返回NotFoundResult对象

当您输入returnnotfound时,编译器将使用将NotFoundResult转换为ActionResult

当您直接返回值时,这可以正常工作,但在三元条件或空合并表达式中使用时,它将不起作用。相反,您必须自己进行转换:

public ActionResult<Round> Get(string id) =>
    this._roundsService.Get(id) ?? new ActionResult<Round>(NotFound());

顺便说一句,Round类也是一个类,因此是引用类型,因此是null。这有帮助吗?IIRC对于接受两种不同类型的空合并运算符来说,一侧必须可强制转换为另一侧。也就是说,一方必须继承另一方,或者两者必须是相同的类型。这是不够的,他们是两个不同的类型继承同一类,空凝聚运算符不考虑将要投什么,只有它返回。我预计它相当于:IFTEMP= =空返回NOTHOST;否则返回温度;。可能是编译器将结果转换为您作为example@MitkoRusev虽然这可能更接近实际代码,但我希望我的示例更清楚一些。一行中的内容太多实际上只会导致理解上的问题。@Christopher Mitko只在一行中写了它,因为您无法在注释中格式化代码,但这只意味着replace temp=NotFound;返回未找到;在你的代码中,谢谢,这确实有效!我还是不明白:给一个表情A??B是B必须是可浇铸的,还是只有当我们没有像公共T Get=>A那样直接返回时才有必要??B@MitkoRusev当然,它必须是可铸造的。var和short运算符不是动态的。编译时类型检查仍然完全发生。还有一些特殊的泛型,所以我们不会破坏编译时类型检查。@Christopher说得通。但是为什么当A可以转换为t,B可以转换为t,但B不能转换为A时,编译器不会出错呢?这可能是@MitkoRusev的一个特性吗?这种情况完全不同。T是返回类型。A可以铸入T。B不能。所以T variable=B值不是有效的赋值。不管你用多少行对它进行squeeze,它仍然是一组独立的操作。@MitkoRusev你是对的,它看起来更像是result=NotFound,因为它确实是编译错误,即使A和B都可以转换为T。public T Get=>TA??B不过行
public ActionResult<Round> Get(string id)
{
    var result = this._roundsService.Get(id);
    if (result != null)
        return result;
    return NotFound();
}