为什么变量名作为下划线字符(“_”)不适用于解构
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);
是一个“元组和对象解构”,在列表中,所以这次_
被当作丢弃,并且这次没有声明一个变量叫_
.
我已经将变量声明为下划线字符_
,编译器能够顺利执行代码。
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);
是一个“元组和对象解构”,在列表中,所以这次_
被当作丢弃,并且这次没有声明一个变量叫_
.