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)
为什么编译器在处理下划线 _ 字符时不一致?
在前三个代码片段中的每一个中,_字符都以不同的方式解释。
这里:
(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)
是一个“元组和对象解构”,在列表中,所以这次_被当作丢弃了,这次它没有声明一个名为_.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |