C# 如何在同一范围内放弃参数和局部变量?
我当前的代码如下所示:C# 如何在同一范围内放弃参数和局部变量?,c#,async-await,task,unused-variables,C#,Async Await,Task,Unused Variables,我当前的代码如下所示: // for given methods like these: // void Foo(Action<int> action) // async Task DoAsync() Foo(unusedInt => { var unusedTask = DoAsync(); }); Foo(_ => { var unusedTask = DoAsync(); }); 或者 但是,如果我对这两种代码都使用,,我会遇到一个错误: Foo(_
// for given methods like these:
// void Foo(Action<int> action)
// async Task DoAsync()
Foo(unusedInt =>
{
var unusedTask = DoAsync();
});
Foo(_ =>
{
var unusedTask = DoAsync();
});
或者
但是,如果我对这两种代码都使用,
,我会遇到一个错误:
Foo(_ =>
{
_ = DoAsync(); // error CS0029
});
错误CS0029:无法将类型“System.Threading.Tasks.Task”隐式转换为“int”
是否要丢弃这两个未使用的变量?或者,有人能确认这在当前的C#规范中是不可能的吗
作为参考,
如果我省略了
未使用的任务
:
Foo(_ =>
{
DoAsync(); // warning CS4014
});
警告CS4014:由于未等待此调用,因此当前方法的执行将在调用完成之前继续。考虑将“Acess”运算符应用到调用的结果。< /P>
我也希望避免此警告。您可以使用
\u
放弃返回值。
但是带有Foo((intvalue)=>
的intvalue不是返回值(这是一个匿名方法)。
如果您使用\uu
,则它是一个正常参数
但是在您的示例中,您必须小心使用\uu
以放弃任务。
让我举个例子:
//Your async method
public async Task DoAsync()
{
Console.WriteLine("Start DoAsync");
await Task.Delay(2000);
Console.WriteLine("End DoAsync");
}
//a method that expects a Action-Delegate with 1 int as parameter
public void IntAction(Action<int> action)
{
action(2);
}
或者这个:
//Here the DoAsync will not wait and write 2 to Console (discard Task)
IntAction(intvalue =>
{
_ = this.DoAsync();
Console.WriteLine(intvalue.ToString());
});
//Output is:
//Start DoAsync
//2
//End DoAsync
调用方法时,不能使用a代替参数,除非它是一个参数。不过,您可以使用双下划线\uuuu
作为参数来传达相同的语义,以避免与方法体中使用的任何真正丢弃冲突
Foo(__ =>
{
_ = DoAsync();
});
Foo
和DoAsync
的签名是什么?Foo
是否接受int
值?如果您没有从Foo返回任务,您应该等待DoAsync@PavelAnikhouski,我在我的代码体前面描述了Foo
和DoAsync
的原型,作为注释:void Foo(Action)
和async Task DoAsync()
。您可以使用
放弃返回值。但是带有Foo((int intvalue)=>
的intvalue不是返回值(这是一个匿名方法)。如果您使用
则它是一个正常参数。我如何以“不可复制或是由输入错误导致”结束此问题这是一个错误分类。这个问题很清楚,也很容易重复,而且很可能不是由任何无意的打字错误引起的。只有一个编译错误,问题是如何在保持理想语法的同时修复这个编译错误。在我看来,这实际上是一个很好的问题(投票结果为上)。IntAction(async(intvalue)=>
将结果发送给代表。这很少是一个好主意。@TheodorZoulias这绝对正确。这只是为了说明当您使用
放弃任务时会发生什么。回答得好。我误解了参数
将被放弃。如果
只是一个正常参数(它的值可以在方法中使用),它不是真正被丢弃的。使用异步方法中潜在错误的例子也很好。但是如果使用双下划线或其他参数名称,则没有区别。这与丢弃无关。参数是一个参数,您可以像string stringvalue=\ux.ToString那样使用它();
。\u
从未分配给值,您不能使用它。@PinBack这是真的。\u
从技术上讲不是丢弃。它只是一个名称,传达了程序员忽略参数值的意图。请看以下内容:。
//Here the DoAsync will not wait and write 2 to Console (discard Task)
IntAction(intvalue =>
{
_ = this.DoAsync();
Console.WriteLine(intvalue.ToString());
});
//Output is:
//Start DoAsync
//2
//End DoAsync
Foo(__ =>
{
_ = DoAsync();
});