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

Vim*_* CK 4 c# .net-core .net-core-3.1

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

 int _ = 10;
 _ += 10;

 onsole.WriteLine(_);
Run Code Online (Sandbox Code Playgroud)

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

(string _, int age) = new Student("Vimal", "Heaven", 20);
Run Code Online (Sandbox Code Playgroud)

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

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

Console.WriteLine(details._);
Run Code Online (Sandbox Code Playgroud)

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

我不是discards在这里讨论 C# 。

Student示例中引用的类。

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);
}
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 5

为什么编译器在处理下划线 _ 字符时不一致?

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

这里:

(string _, int age) details = student.GetDetails();
Run Code Online (Sandbox Code Playgroud)

(string _, int age)在语法上是变量的类型details变量名是details,不是__是类型名称的一部分,特别是元组字段名称

文档(强调我的):

您可以通过为变量分配下划线 (_) 作为其名称来指示该变量是丢弃的。

所以_in(string _, int age) details不是丢弃。这就是为什么您可以将其作为details._.

稍后在同一页面中:

在 C# 7.0 中,以下上下文中的赋值支持丢弃:

  • 元组和对象解构。
  • 使用 is 和 switch 进行模式匹配。
  • 调用不带参数的方法。
  • 范围内没有 _ 时的独立 _。

你这里的情况:

int _ = 10; 
_ += 10;

Console.WriteLine(_);
Run Code Online (Sandbox Code Playgroud)

不在列表中,因此丢弃在那里不适用。在第一行中,它不是“独立的_”,因此_不是丢弃,并且您声明了一个名为_. 在接下来的几行中,有一个_in 范围,因为您在第一行声明了一个具有该名称的变量。

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

(string _, int age) = new Student("Vimal", "Heaven", 20);
Run Code Online (Sandbox Code Playgroud)

是一个“元组和对象解构”,在列表中,所以这次_被当作​​丢弃了,这次它没有声明一个名为_.