【发布时间】:2020-09-15 11:04:37
【问题描述】:
我当前的代码是这样的:
// for given methods like these:
// void Foo(Action<int> action)
// async Task DoAsync()
Foo(unusedInt =>
{
var unusedTask = DoAsync();
});
我知道我可以使用自 C#7.0 以来的丢弃变量 (_),如下所示:
Foo(_ =>
{
var unusedTask = DoAsync();
});
或者,
Foo(unusedInt =>
{
_ = DoAsync();
});
但是如果我对它们都使用_,我会遇到错误:
Foo(_ =>
{
_ = DoAsync(); // error CS0029
});
错误 CS0029:无法将类型“System.Threading.Tasks.Task”隐式转换为“int”
是否可以丢弃两个未使用的变量?
或者,任何人都可以确认在当前的 C# 规范中这是不可能的吗?
供参考,
如果我省略unusedTask:
Foo(_ =>
{
DoAsync(); // warning CS4014
});
警告 CS4014:由于未等待此调用,因此在调用完成之前继续执行当前方法。考虑将 'await' 运算符应用于调用结果。
我也想避免这个警告。
【问题讨论】:
-
Foo和DoAsync的签名是什么?Foo是否接受int值? -
如果你没有从 Foo 返回任务,你应该等待 DoAsync
-
@PavelAnikhouski,我在代码体前面描述了
Foo和DoAsync的原型作为注释:void Foo(Action<int> action)和async Task DoAsync()。 -
您可以使用
_丢弃返回值。但是Foo((int intvalue) =>的 intvalue 不是返回值(这是一个匿名方法)。如果使用_,则为普通参数。 -
恕我直言,将此问题关闭为“不可重现或由拼写错误引起”是错误分类。该问题清晰且易于重现,并且AFAIK不是由任何无意的错字引起的。只有一个编译错误,问题具体是如何修复这个编译错误,同时保持理想的discard 语法。在我看来,这实际上是一个很好的问题(赞成)。
标签: c# async-await task unused-variables