gpt4 book ai didi

c# - 在 C# 中调用的变量声明 "var (name, categoryId) = object"是什么?

转载 作者:行者123 更新时间:2023-12-03 17:15:29 24 4
gpt4 key购买 nike

我正在使用 .NET 4.8 并使用 Deconstructor 声明一条记录:

public record Product
{
public string Name { get; }
public int CategoryId { get; }

public Product(string name, int categoryId)
=> (Name, CategoryId) = (name, categoryId);

public void Deconstruct(out string name, out int categoryId)
=> (name, categoryId) = (Name, CategoryId);
}
然后我使用以下已编译的代码,它工作正常:
var product = new Product("VideoGame", 1);
var (name, categoryId) = product;
string s = name;
int i = categoryId;
虽然此代码不起作用,但会生成错误:

"Error CS0029 Cannot implicitly convert type 'ConsoleApp4.Product' to 'System.Tuple<string, int>'"):

var product = new Product("VideoGame", 1);
Tuple<string, int> t = product;
string s = t.Item1;
int i = t.Item2;
声明 var (name, categoryId)不清楚。它是什么?
这个变量的类型是什么?规范中如何称呼这种结构?
这是幕后自动生成的类型吗? namecategoryId是它的属性吗?

最佳答案

注意语法

var (name, categoryId) = product;
解构 - 它不是对元组的赋值。
From the docs

Starting with C# 7.0, you can retrieve multiple elements from a tuple or retrieve multiple field, property, and computed values from an object in a single deconstruct operation. When you deconstruct a tuple, you assign its elements to individual variables. When you deconstruct an object, you assign selected values to individual variables.


忽略 Deconstruct暂时,只要提供足够的变量(或丢弃, _ )来容纳元组,任何元组都可以解构为单个变量。
例如
(string name, int categoryId) = ("Hello", 123);
将“Hello”分配给 name , 和 123 到 categoryId以下所有内容都是等效的
(string name, int categoryId) = ("Hello", 123); // Types of tuple match position vars
(var name, var categoryId) = ("Hello", 123); // Type variable types are inferred
var (name, categoryId) = ("Hello", 123);
同样,通过提供合适的 Deconstruct您自己的类/记录的重载或扩展方法,您可以将多个变量分配给 out匹配参数 Deconstruct方法:
var (name, categoryId) = Product; 
它告诉编译器寻找合适的 Deconstruct Product 的过载.
在这种情况下,因为您使用的是 var对于所有解构的类型推断,解构函数必须有 2 个参数(任何类型,都将被推断)。
这里还有一些其他细微差别。
首先,如您所见,您可以声明许多不同的 Deconstructions为您 Product记录,只要解构的签名不同。
(值)元组语法
public void Deconstruct(out string name, out int categoryId)
=> (name, categoryId) = (Name, CategoryId);
只是一个方便的简写
public void Deconstruct(out string name, out int categoryId)
{
name = Name;
categoryId = CategoryId;
}
当您进行以下分配时:
 var (name, categoryId) = product;
  • 一个合适的解构重载位于 Product ,在这种情况下,因为您使用的是 var类型推断,解构器必须有 2 个参数(但任何类型)。
  • 然后输出变量是 assigned到您的解构变量,您也将其命名为 string nameint categoryId .

  • 虽然不能直接解构 INTO System.ValueTupleSystem.Tuple ,你可以从两者中解构
    var (name, categoryId) = Tuple.Create("Hello", 123); // Old Heap tuples

    var (name, categoryId) = ("Hello", 123); // Newer value tuples
    解构的主要用途之一是在 Pattern matching 期间使用简写符号。 ,您可以在其中快速推理类型和属性:
    例如代替
    var result = product switch
    {
    Product x when x.CategoryId == 3 => "You've got a category 3 product",
    Product x when string.IsNullOrWhiteSpace(x.Name) => "That product looks broken",
    _ => "Just a standard product"
    };
    您可以根据需要进行解构和/或丢弃:
    var result2 = product switch
    {
    var (_, cat) when cat == 3 => "You've got a category 3 product",
    var (str, _) when string.IsNullOrWhiteSpace(str) => "That product looks broken",
    _ => "Just a standard product"
    };

    关于c# - 在 C# 中调用的变量声明 "var (name, categoryId) = object"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64202365/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com