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



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

int _ = 10;
_ += 10;
onsole.WriteLine(_);

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

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

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

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

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

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

示例中引用的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);
}

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

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

此处:

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

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

来自文档(强调我的(:

您通过将下划线(_(指定为变量的名称来指示变量是丢弃的。

因此(string _, int age) details中的_不是丢弃。这就是为什么您可以作为details._访问它。

稍后在同一页:

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

  • 元组与对象解构
  • 与is和switch匹配的模式
  • 对没有参数的方法的调用
  • 一个独立的_当范围内没有_时

您在这里的情况:

int _ = 10; 
_ += 10;
Console.WriteLine(_);

不在列表中,因此丢弃不适用于该列表。在第一行中,它不是";一个独立的CCD_ 16〃;,所以_不是丢弃,并且您声明了一个名为_的变量。在以下几行中,作用域中有一个_,因为您在第一行中声明了一个具有该名称的变量。

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

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

是";元组与对象解构";,它在列表中,所以这次_被视为丢弃,而这次它没有声明一个名为_的变量。

最新更新