Home > database >  Parenthesis Tuple(?) Syntax in C#
Parenthesis Tuple(?) Syntax in C#

Time:01-04

I just saw the following syntax in code: (int, string) testTwo

It seems to mimic a Tuple, but the return types are incompatible with a Tuple. Example:

Tuple<int, string> test = Test.Get(); // This doesn't work
(int, string) testTwo = Test.Get(); // This works

public static class Test
{
  public static (int, string) Get()
  {
    return (1, "2");
  }
}

Seems like you can name the params too, but this appears to be for readability only, e.g.:

public static (int foo, string bar) Get()

  1. What is this syntax called?
  2. What's the real world use case?

CodePudding user response:

There are two tuple types in the modern C#/.NET - "old" ones - series of Tuple classes and value tuples introduced in C# 7 which are syntactic sugar based on series of ValueTuple structs and there is no conversions between those two (though both can be deconstructed - var (i1, i2) = Tuple.Create(1,2); and var (i1, i2) = (1,2); both are a valid code).

Tuples vs System.Tuple

C# tuples, which are backed by System.ValueTuple types, are different from tuples that are represented by System.Tuple types. The main differences are as follows:

  • System.ValueTuple types are value types. System.Tuple types are reference types.
  • System.ValueTuple types are mutable. System.Tuple types are immutable.
  • Data members of System.ValueTuple types are fields. Data members of System.Tuple types are properties.

CodePudding user response:

When creating a Tuple in parentheses it's a value type, specifically it's a System.ValueTuple. System.Tuple is a reference type.

CodePudding user response:

It's a Tuple type which maps to System.ValueTuple, a value type, available in .NET Core and Framework 4.7 .

A ValueTuple and a Tuple are distinct, incompatible types.

The syntax with parentheses is tuple assignment and deconstruction.

  •  Tags:  
  • c#
  • Related