C# ValueTuple properties naming

房东的猫 提交于 2019-12-10 04:08:21

问题


I'm trying ValueTuple Class in C#, and i have a doubt about properties naming, let's see:

If instantiate a ValueTuple declaring the object like this: var tuple1 = (Name: "Name1", Age: 25); We can name the properties,

but, like this: ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);

we get a warning that says the names are ignored,so

We should type: ValueTuple<string,int> tuple2 = ("Name1",25);

Then the properties will be tuple2.Item1 and tuple2.Item2

Can someone explain this newbie the reason about this?

Than you in advantage


回答1:


There are two different "kinds" of tuples involved here: the .NET ValueTuple<...> types, and C# tuple types. C# tuple types can have element names; ValueTuple<...> types can't. (There's simply nowhere in the type system for that to live in a normal way.)

At execution time, a value is only aware of its .NET type. For example, if you use:

(string x, int y) tuple1 = ("hello", 10);
(string a, int b) tuple2 = ("hello", 10);
DoSomethingWithValue(tuple1);
DoSomethingWithValue(tuple2);
...
void DoSomethingWithValue(object value) { ... }

then DoSomethingWithValue wouldn't be able to distinguish between the two tuple values at all. The information is only available at compile-time.

Information about element names for things like parameters and return types is propagated via attributes that the C# compiler consumes. So for example, a method declared like this:

public (string name, int score) GetFoo()

is compiled in IL as if it had been declared like this:

[TupleElementNames(new string[] { "name", "score" }]
public ValueTuple<string, int> GetFoo()

The C# language defines appropriate conversions between the .NET types and the C# tuple types to make it as seamless as possible.

In terms of how to use tuples, I'd use the C# tuple types as far as you can. Naming the tuple elements makes a huge difference in usability.




回答2:


What you want to define is

(string Name,int Age) tuple1 = (Name: "Name1", Age: 25);

what you are defining is

ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);

Look at the difference between in Type you are defining. Both are two different things if you take the name.




回答3:


In short: No, you can't create ValueTuples with named fields like this.

In detail: Have a look at Name ValueTuple properties when creating with new - your question is answered very well there.



来源:https://stackoverflow.com/questions/46601631/c-sharp-valuetuple-properties-naming

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!