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