C# 如何使用??有回报吗?

C# 如何使用??有回报吗?,c#,C#,只要有这样的对象,我就想返回Todo对象,否则返回NotFound()。我还想只使用由返回和组成的单行。以下代码在编译时产生错误。如何解决 public async Task<ActionResult<Todo>> GetTodo(long id) { return await _context.Todos.FindAsync(id) ?? NotFound(); } 公共异步任务 尝试2 尝试3 MarTim的尝试通过了编译器 public async Ta

只要有这样的对象,我就想返回
Todo
对象,否则返回
NotFound()
。我还想只使用由
返回
组成的单行。以下代码在编译时产生错误。如何解决

public async Task<ActionResult<Todo>> GetTodo(long id)
{
    return await _context.Todos.FindAsync(id) ?? NotFound();
}
公共异步任务

尝试2

尝试3 MarTim的尝试通过了编译器

public async Task<IActionResult> GetTodo(long id)
{
    return (IActionResult)(await _context.Todos.FindAsync(id)) ?? NotFound();
}
公共异步任务GetTodo(长id)
{
返回(IActionResult)(等待上下文.Todos.FindAsync(id))??未找到();
}
但会生成运行时错误:


让我们简化一下:

public async Task<ActionResult<Todo>> GetTodo(long id)
{
    Todo todo = await _context.Todos.FindAsync(id);
    return todo ?? NotFound();
}
或者,您可以使用助手方法:

public static ActionResult<T> ResultOrNotFound<T>(T item) where T : class
{
    return item != null ? new ActionResult<T>(item) : new ActionResult<T>(NotFound());
}
然后你可以写:

public async Task<ActionResult<Todo>> GetTodo(long id)
{
    return (await _context.Todos.FindAsync(id)) ?? new ActionResult<Todo>(NotFound());
}
public async Task<ActionResult<Todo>> GetTodo(long id)
{
    return ResultOrNotFound(await _context.Todos.FindAsync(id));
}
public async Task<IActionResult<Todo>> GetTodo(long id)
{
    return OkOrNull(await _context.Todos.FindAsync(id)) ?? NotFound();
}
public async Task<IActionResult<Todo>> GetTodo(long id)
{
    return await OkOrNull(_context.Todos.FindAsync(id)) ?? NotFound();
}
公共异步任务GetTodo(长id)
{
返回OkOrNull(wait_context.Todos.FindAsync(id))??NotFound();
}
如果您愿意,您可以通过另一个重载使其看起来更好:

public static async Task<IActionResult> OkOrNull<T>(Task<T> task) where T : class
{
    T item = await task;
    return item != null ? Ok(item) : null;
}
公共静态异步任务OkOrNull(任务任务),其中T:class
{
T项=等待任务;
退货项目!=null?确定(项目):null;
}
意思是你可以写:

public async Task<ActionResult<Todo>> GetTodo(long id)
{
    return (await _context.Todos.FindAsync(id)) ?? new ActionResult<Todo>(NotFound());
}
public async Task<ActionResult<Todo>> GetTodo(long id)
{
    return ResultOrNotFound(await _context.Todos.FindAsync(id));
}
public async Task<IActionResult<Todo>> GetTodo(long id)
{
    return OkOrNull(await _context.Todos.FindAsync(id)) ?? NotFound();
}
public async Task<IActionResult<Todo>> GetTodo(long id)
{
    return await OkOrNull(_context.Todos.FindAsync(id)) ?? NotFound();
}
公共异步任务GetTodo(长id)
{
return wait-OkOrNull(_-context.Todos.FindAsync(id))??NotFound();
}
公共异步任务GetTodo(长id)=>
ToActionResult(wait_context.Todos.FindAsync(id))??NotFound();
私有静态IActionResult到ActionResult(T x)
其中T:class=>
x==null
? 无效的
:((IConvertToActionResult)新操作结果(x)).Convert();

错误是什么?看起来类型不匹配-
FindAsync
不返回
ActionResult
,它返回一个
Todo
@CharlesMager:但是
ActionResult
有一个神奇的隐式cast操作符。哦,不。你改变了要求,解决方案必须只使用一个
返回
。这意味着如果我坚持使用我添加的单个
返回
?@artificialstuption,就没有解决方案另一个选项使用帮助器方法,但这意味着您可以使用
return
。很遗憾,我不认为你会比这更接近。@canton7你在“??”之前的最后一个方法中缺少了一个“)”@artificialstupicity你没有完全复制这个答案-这使用
任务
作为返回type@ArtificialStupidity我改变了我的答案,希望这对你有用。但它不符合问题中给出的要求。谢谢大家!@人工智能我不知道你真的想用??操作人员这个怎么样?@MarTim,如果
todo
为空,它将不起作用?由于
(ActionResult)null
是一个完全有效的
ActionResult
,因此您永远不会得到
NotFound()