In my code I have:
private static readonly ValueTuple<string, string>[] test = {("foo", "bar"), ("baz", "foz")};
But when I compile my code, I get:
TypoGenerator.cs(52,76): error CS1026: Unexpected symbol `,', expecting `)'
TypoGenerator.cs(52,84): error CS1026: Unexpected symbol `)', expecting `)'
TypoGenerator.cs(52,94): error CS1026: Unexpected symbol `,', expecting `)'
TypoGenerator.cs(52,103): error CS1026: Unexpected symbol `)', expecting `)'
TypoGenerator.cs(117,42): error CS1525: Unexpected symbol `('
TypoGenerator.cs(117,58): error CS1525: Unexpected symbol `['
What is the correct way to create and initialize an array of ValueTuples?
Try to create an instance of array with new and instances of tuple with new keyword
private static readonly ValueTuple<string, string>[] test = new ValueTuple<string, string>[]{
new ValueTuple<string, string>("foo", "bar"),
new ValueTuple<string, string>("baz", "foz")
};
or with C#7 tuple syntax
private static readonly ValueTuple<string, string>[] test = new ValueTuple<string, string>[]{
("foo", "bar"),
("baz", "foz")
};
Update:
Right now all declarations from the question and this answer works fine with Rider 2017.1 build #RD-171.4456.1432 and .NET Core 1.0.4. The simplest one is that @ZevSpitz mentioned in comments and it looks as follows:
private static readonly (string, string)[] test = {("foo", "bar"), ("baz", "foz")};
There is no need to add specific type for ValueTuple. Notice that for .NET Core the NuGet package System.ValueTuple has to be installed.
Three short examples of using C# 7 syntax of array ValueTuple declaration & initialization:
(int Alpha, string Beta)[] array1 = { (Alpha: 43, Beta: "world"), (99, "foo") };
(int Alpha, string Beta)[] array2 = { (43, "world"), (99, "foo") };
(int, string)[] array3 = { (43, "world"), (99, "foo") }; // Item1, Item2, ...
These all compile fine on VS2017
Linq can be a good way to create arrays of ValueTuples, also:
var foo = Enumerable.Range(1,10).Select(z=> (Alpha: 43, Beta: "world")).ToArray();
You can create a new tuple like this
var logos = new (string Name, string Uri)[]
{
("White", "white.jpg"),
("Black", "black.jpg"),
};