我正在使用新的.NET工具编写C#库。我正在尝试使用C#7.0中的discards。我遇到了编译器将_
视为参数而不是丢弃的问题。
示例:
using System;
public delegate void Delegate1(string a, Delegate2 b);
public delegate void Delegate2(int a, Delegate3 b);
public delegate void Delegate3(string a, Delegate4 b);
public delegate void Delegate4(int a, int b);
class Program
{
void Test(Delegate1 f)
{
f("x", (_, g) => {
g("y", (i, _) => {
Console.WriteLine(i);
});
});
}
}
大厦:
% dotnet build ~/Source/temp
Microsoft (R) Build Engine version 15.5.179.9764 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
Restore completed in 18.6 ms for /Users/me/Source/temp/temp.csproj.
Program.cs(13,24): error CS0136: A local or parameter named '_' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter [/Users/me/Source/temp/temp.csproj]
Build FAILED.
Program.cs(13,24): error CS0136: A local or parameter named '_' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter [/Users/me/Source/temp/temp.csproj]
0 Warning(s)
1 Error(s)
Time Elapsed 00:00:02.45
答案 0 :(得分:6)
您正在尝试使用丢弃程序,但您的方案没有。 _
参数只是常规变量。如果您更改代码以从_
参数添加分配,则可以看到此内容:
void Test(Delegate1 f)
{
f("x", (_, g) => {
int a = _;
g("y", (i, _) => {
Console.WriteLine(i);
});
});
}
如果外部lambda中的_
实际上是丢弃的,那么就会出现编译器错误。但事实并非如此。它只是一个普通的旧变量,你得到一个简单的旧“该名称被使用”错误。