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()