为什么变量名作为下划线字符(“_”)不适用于解构

Why variable name as underscore character ("_") not working for Deconstruction

我已经将变量声明为下划线字符_,编译器能够顺利执行代码。

 int _ = 10;
 _ += 10;

 onsole.WriteLine(_);

但是,对于如下所示的 Deconstruction 语法,编译器未检测到名为下划线字符 _ 的变量。

(string _, int age) = new Student("Vimal", "Heaven", 20);

同时,编译器和 Visual Studio 智能感知检测到名为下划线的变量 _ 另一种语法如下所示。

var student  = new Student("Vimal", "Heaven", 20);
(string _, int age) details = student.GetDetails();

Console.WriteLine(details._);

我了解到没有人使用下划线字符来命名变量。为什么编译器在处理下划线 _ 字符时不一致?

我不是在这里讨论 C# discards

示例中提到的 Student class。

public class Student
{
    public string Name { get; set; }
    public string Address { get; set; }
    public int Age { get; set; }

    public Student(string name, string address, int age = 0) => (Name, Address, Age) = (name, address, age);

    public void Deconstruct(out string name, out int age) => (name, age) = (Name, Age);
    public (string, int) GetDetails() => (Name, Age);
}

Why compiler is inconsistent in handling the underscore _ character?

在前三个代码片段中,_ 字符以不同的方式解释。

这里:

(string _, int age) details = student.GetDetails();

(string _, int age)语法上是变量details类型,变量名是details,不是_ . _ 是类型名称的一部分,特别是 tuple field name.

来自 docs(强调我的):

You indicate that a variable is a discard by assigning it the underscore (_) as its name.

所以 (string _, int age) details 中的 _ 不是弃牌。这就是为什么您可以使用 details._.

访问它的原因

同一页后面:

In C# 7.0, discards are supported in assignments in the following contexts:

  • Tuple and object deconstruction.
  • Pattern matching with is and switch.
  • Calls to methods with out parameters.
  • A standalone _ when no _ is in scope.

你这里的情况:

int _ = 10; 
_ += 10;

Console.WriteLine(_);

不在列表中,因此丢弃不适用。在第一行中,它不是“A standalone _”,因此 _ 不是丢弃项,您声明了一个名为 _ 的变量。在接下来的几行中,范围内有一个 _,因为您在第一行声明了一个具有该名称的变量。

您显示的第二个代码片段:

(string _, int age) = new Student("Vimal", "Heaven", 20);

是一个“元组和对象解构”,在列表中,所以这次_被当作丢弃,并且这次没有声明一个变量叫_ .