我已经将一个变量声明为下划线字符_
,如下所示,编译器能够顺利执行代码。
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);
是";元组与对象解构";,它在列表中,所以这次_
被视为丢弃,而这次它没有声明一个名为_
的变量。