简体   繁体   中英

C# ValueTuple properties naming

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

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.

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM