C# ValueTuple 属性命名
C# ValueTuple properties naming
我在 C# 中尝试 ValueTuple Class,我对属性命名有疑问,让我们看看:
如果实例化一个 ValueTuple 声明这样的对象:var tuple1 = (Name: "Name1", Age: 25);
我们可以命名属性,
但是,像这样:ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);
我们收到一条警告,说名字被忽略了,所以
我们应该输入:ValueTuple<string,int> tuple2 = ("Name1",25);
那么属性将是tuple2.Item1
和tuple2.Item2
谁能解释一下这个新手这是什么原因?
比你有优势
简而言之:不,您不能使用这样的命名字段创建 ValueTuples。
详细说明:看看 - 你的问题在那里得到了很好的回答。
你要定义的是
(string Name,int Age) tuple1 = (Name: "Name1", Age: 25);
你定义的是
ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);
查看您定义的类型之间的区别。如果你取名字,两者是两个不同的东西。
这里涉及两种不同的 "kinds" 元组:.NET ValueTuple<...>
类型和 C# 元组类型。 C# 元组类型可以有元素名称; ValueTuple<...>
类型不能。 (在类型系统中根本没有任何地方可以让它以正常的方式存在。)
在执行时,一个值只知道它的 .NET 类型。例如,如果您使用:
(string x, int y) tuple1 = ("hello", 10);
(string a, int b) tuple2 = ("hello", 10);
DoSomethingWithValue(tuple1);
DoSomethingWithValue(tuple2);
...
void DoSomethingWithValue(object value) { ... }
那么 DoSomethingWithValue
根本无法区分这两个元组值。该信息仅在编译时可用。
有关参数和 return 类型等元素名称的信息是通过 C# 编译器使用的属性传播的。因此,例如,这样声明的方法:
public (string name, int score) GetFoo()
在 IL 中编译就好像它是这样声明的:
[TupleElementNames(new string[] { "name", "score" }]
public ValueTuple<string, int> GetFoo()
C# 语言定义了 .NET 类型和 C# 元组类型之间的适当转换,以使其尽可能无缝。
关于如何使用元组,我会尽可能使用 C# 元组类型。命名元组元素会在可用性方面产生巨大差异。
我在 C# 中尝试 ValueTuple Class,我对属性命名有疑问,让我们看看:
如果实例化一个 ValueTuple 声明这样的对象:var tuple1 = (Name: "Name1", Age: 25);
我们可以命名属性,
但是,像这样:ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);
我们收到一条警告,说名字被忽略了,所以
我们应该输入:ValueTuple<string,int> tuple2 = ("Name1",25);
那么属性将是tuple2.Item1
和tuple2.Item2
谁能解释一下这个新手这是什么原因?
比你有优势
简而言之:不,您不能使用这样的命名字段创建 ValueTuples。
详细说明:看看
你要定义的是
(string Name,int Age) tuple1 = (Name: "Name1", Age: 25);
你定义的是
ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);
查看您定义的类型之间的区别。如果你取名字,两者是两个不同的东西。
这里涉及两种不同的 "kinds" 元组:.NET ValueTuple<...>
类型和 C# 元组类型。 C# 元组类型可以有元素名称; ValueTuple<...>
类型不能。 (在类型系统中根本没有任何地方可以让它以正常的方式存在。)
在执行时,一个值只知道它的 .NET 类型。例如,如果您使用:
(string x, int y) tuple1 = ("hello", 10);
(string a, int b) tuple2 = ("hello", 10);
DoSomethingWithValue(tuple1);
DoSomethingWithValue(tuple2);
...
void DoSomethingWithValue(object value) { ... }
那么 DoSomethingWithValue
根本无法区分这两个元组值。该信息仅在编译时可用。
有关参数和 return 类型等元素名称的信息是通过 C# 编译器使用的属性传播的。因此,例如,这样声明的方法:
public (string name, int score) GetFoo()
在 IL 中编译就好像它是这样声明的:
[TupleElementNames(new string[] { "name", "score" }]
public ValueTuple<string, int> GetFoo()
C# 语言定义了 .NET 类型和 C# 元组类型之间的适当转换,以使其尽可能无缝。
关于如何使用元组,我会尽可能使用 C# 元组类型。命名元组元素会在可用性方面产生巨大差异。